在Java等语言中,变量是具有块作用域存在的,即一个变量的作用范围是在定义它的由“{”和“}”括起来的语句块中,在这个块中该变量不可见。但是在JavaScript里,变量的作用域是函数范围的作用域,即一个变量在定义它的函数之内都可见,即使在该变量的定义语句之前。
function scopeTest() { alert(var1); //结果为undefined,可用但还未初始化 var var1 = "var1"; //定义变量var1,变量函数内可见,但在赋值语句之前可能未被初始化 var2 = "var2"; //因为var2函数内可见 ,因此可以在定义语句前赋值(不是全局变量) alert(this.var2); //结果为undefined,证明上一条语句不是定义了一个全局变量 alert(var2); //结果为var2,定义并赋值了 var var2; //定义变量var2 }
在JavaScript中,当使用一个变量时,是沿着从使用处开始的作用域链查找,当使用处所在的function定义了该变量时,使用该定义的变量;当这个function不存在这个变量时,会继续往外一层的function寻找,直至达到最外层仍不能找到该变量的定义或着全局变量赋值语句,则出错。
function scopeChainTest() { var v1 = "v1 from scopeChainTest()"; var v2 = "v2 from scopeChainTest()"; var v3 = "v3 from scopeChainTest()"; outer(); function outer() { var v1 = "v1 from outer()"; var v2 = "v2 from outer()"; inner(); function inner() { var v1 = "v1 from inner()"; alert(v1);//结果为v1 from inner() alert(v2);//结果为v2 from outer() alert(v3);//结果为v3 from scopeChainTest() } } } //调用scopeChainTest() window.onload = scopeChainTest();