JavaScript变量作用域、函数作用域和声明提前
1.变量作用域
在函数体内,局部变量的优先级高于同名的全局变量。如果在函数体内声明的一个局部变量或者函数参数中带有的变量和全局变量重名,那么全局变量就被局部变量所遮盖。
尽管在全局作用域编写代码可以不写var语句,但声明局部变量时则必须使用var语句。(不使用var定义的局部变量会认为是全局变量)
var scope = "global"
var scope1 = "global1"
function checkscope(){
var scope = 'local'; //声明一个全局变量,甚至不用var来声明
scope1 = 'local1'; //糟糕!我们刚修改了一个新的全局变量
myscope = "local"; //这里显式地声明了一个新的全局变量
return scope;
}
scope
"global"
scope1
"local1"
2.函数作用域
JavaScript没有块级作用域(block scope),JavaScript有函数作用域(function scope),函数作用域就是在声明它们地函数体以及这个函数体嵌套的任意函数体内都是有定义的。
function test(o){
var i = 0; //i在整个函数体内均是有定义的
if(typeof o == 'object' ){
var j = 0; //j在函数体内是有定义的,不仅仅是在这个代码段内
for(var k=0;k<10;k++){ //k在函数体内是有定义的,不仅仅是在循环内
console.log(k);
}
console.log(k); //k已经定义了,输出10
}
console.log(j); //j已经定义了,但可能没有初始化
}
我们在不同的位置定义了变量i、j和k,它们都在同一个作用域内——这三个变量在函数体内均是有定义的。
再看一个例子:
<script type="text/javascript">
var m = 5;
if(m == 5){
var n = 10;
}
alert(n); //代码1
</script>
n一样可以正常输出10,因为没有块级作用域,大括号里面的变量也是全局变量,当然就可以正常访问了。 记住一点:函数内部的变量才是局部变量(包括形参)。
3.声明提前
JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。有意思的是,这意味着变量在声明之前甚至已经可用。JavaScript的这个特性被非正式地称为声明提前(hosting),即JavaScript函数里声明地所有变量(但不涉及赋值)都被“提前”至函数体的顶部。
var scope = "global";
function f(){
console.log(scope); //输出"undefined",而不是"global"
var scope = "local"; //变量在这里赋初始值,但变量本身在函数体内任何地方均是有定义的
console.log(scope); //输出"local"
}
总结:声明提前,赋值不提前。
还没有评论,来说两句吧...