1、JavaScript 的变量作用域的总结首先要注意的是:JavaScript 的变量作用域是基于其特有的作用域链的。JavaScript 没有块级作用域。函数中声明的变量在整个函数中都有定义。1、 JavaScript 的作用域链首先看下下面这段代码:var rain = 1;function rainman()var man = 2;function inner()var innerVar = 4;alert(rain);inner(); /调用 inner 函数rainman(); /调用 rainman 函数观察 alert(rain);这句代码。JavaScript 首先在 inner
2、 函数中查找是否定义了变量 rain,如果定义了则使用 inner 函数中的 rain 变量;如果 inner 函数中没有定义 rain 变量,JavaScript 则会继续在 rainman 函数中查找是否定义了 rain 变量,在这段代码中 rainman 函数体内没有定义 rain 变量,则JavaScript 引擎会继续向上(全局对象)查找是否定义了 rain;在全局对象中我们定义了rain = 1,因此最终结果会弹出 1。作用域链:JavaScript 需要查询一个变量 x 时,首先会查找作用域链的第一个对象,如果以第一个对象没有定义 x 变量,JavaScript 会继续查找有没有
3、定义 x 变量,如果第二个对象没有定义则会继续查找,以此类推。上面的代码涉及到了三个作用域链对象,依次是:inner、rainman、window。2、函数体内部,局部变量的优先级比同名的全局变量高。var rain = 1; /定义全局变量 rainfunction check()var rain = 100; /定义局部变量 rainalert( rain ); /这里会弹出 100check();alert( rain ); /这里会弹出 13、 JavaScript 没有块级作用域。这一点也是 JavaScript 相比其它语言较灵活的部分。仔细观察下面的代码,你会发现变量 i、j、k
4、 作用域是相同的,他们在整个 rain 函数体内都是全局的。function rainman()/ rainman 函数体内存在三个局部变量 i j kvar i = 0;if ( 1 ) var j = 0;for(var k = 0; k 4、函数中声明的变量在整个函数中都有定义。首先观察这段代码:function rain()var x = 1;function man()x = 100;man(); /调用 manalert( x ); /这里会弹出 100rain(); /调用 rain上面得代码说明了,变量 x 在整个 rain 函数体内都可以使用,并可以重新赋值。由于这条规则,会
5、产生“匪夷所思”的结果,观察下面的代码。var x = 1;function rain()alert( x ); /弹出 undefined,而不是 1var x = rain-man;alert( x ); /弹出 rain-manrain();是由于在函数 rain 内局部变量 x 在整个函数体内都有定义( var x= rain-man,进行了声明) ,所以在整个 rain 函数体内隐藏了同名的全局变量 x。这里之所以会弹出undefined是因为,第一个执行 alert(x)时,局部变量 x 仍未被初始化。所以上面的 rain 函数等同于下面的函数:function rain()var x;alert( x );x = rain-man;alert( x );5、未使用 var 关键字定义的变量都是全局变量。function rain()x = 100; /声明了全局变量 x 并进行赋值rain();alert( x ); /会弹出 100这也是 JavaScript 新手常见的错误,无意之中留下的许多全局变量。6、全局变量都是 window 对象的属性var x = 100 ;alert( window.x );/弹出 100alert(x);等同于下面的代码window.x = 100;alert( window.x );alert(x)