在javascript中,变量的作用域有全局(window对象)作用域和函数调用作用域。
以下变量具有全局作用域
1. 所有在最外层定义(非函数体内定义)的变量都拥有全局作用域
2. 所有末定义直接赋值的变量,系统会自动声明为拥有全局作用域的变量
3. 所有window对象的属性拥有全局作用域
以下变量具有函数作用域
1. 在函数体内部用var定义的变量,这里要注意一点,只要是在函数里定义的变量,就算是在最后一句定义,该变量也拥有整个函数的作用域。
下面看一段代码:
var tt = 'aa';
function test(){
alert(tt);
var tt = 'dd';
alert(tt);
}
test();
很多人第一反映认为输出结果是: aa dd (XXXXX)
经过测试后我们会发现结果是:undefind dd为什么会产生这样的结果,这是因为javascript预编译和处理,var申明的变量进行了预编译,赋值操作未执行
所以先输出undefined,不会报错或者输出全局变量tt的值
还有一个经典的例子:
var a = 10;
function test() {
a = 100;
alert(a);
alert(this.a);//相当于window.a,调用的是全局变量
var a;
alert(a);
}
test();
相当于:
var a = 10;
function test() {
var a;
a = 100;
alert(a);//调用的是局部变量a
alert(this.a);//相当于window.a,调用的是全局变量
alert(a);//调用的是局部变量a
}
test();
产生的结果是:100 10 100
从上面两个例子,我们可以清楚的认识到:
一个函数被定义的时候,自带的变量属性会被预编译
当被执行的时候,首先创建函数自定义的变量(如 var a; 无论a在函数哪个地方定义,函数执行时会首先被创建,值为undifined)
函数引用到一个变量的时候,会循着变量属性查找,如果自身有定义,则不访问全局变量。