js中的变量作用域
重要法则:
1.不存在块级作用域,即
代码块不会创建新的作用域
2.遵循词法作用域,即
函数在定义它们的作用域里运行,而不是在执行它们的作用域里运行
示例代码:
var x=1;
function f1(){
alert(x);
if(true){
var x=10;
}alert(x);
}
f1();
alert(x);
结果:undefined 10 1
解释:
1.由于代码块不会创建新的作用域,所以if语句中的var x创建的x变量的作用域不是if语句的代码块,而是函数f1中。
2.由于遵循词法作用域,所以x变量的作用域在定义它的作用域里,它在函数f1中定义,所以它的作用域就是f1,而不是在执行f1的作用域里(全局作用域)。
因此,由于在if代码块中申明了x变量,而代码块不会创建新的作用域,所以这个x变量的作用域是整个f1,所以在执行第一个alert(x)的时候,这个x的作用域实际上是f1中(定义它的作用域里),而不是全局变量中的x(而不是执行它的作用域里),所以此时x还没有被赋值,因此输出undefined;第二个alert(x),已经被赋值为10;f1()执行完毕后,f1作用域里的x被回收,再执行alert(x)时,这个x的作用域为全局作用域(定义它的作用域,此时执行它的作用域和定义它的作用域是一致的,都是全局作用域),即1.
简单一点看就是,只要在函数里定义了变量,都把他们的声明提到函数的最前面来,然后函数里的变量覆盖了全局变量,因此上面的代码我们可以看成是这样的:
var x=1;
function f1(){
var x;alert(x);if(true){
x=10;
}alert(x);
}
f1();
alert(x);