所谓静态作用域,是相对于动态作用域而言的,是指变量的作用域是在代码编译阶段确定的,又称之为词法作用域,而动态作用域语言的变量作用域是在代码执行阶段确定的,这里不论。
理解JavaScript静态作用域的关键在于理解变量的作用域是由使用该变量的源代码位置确定,而不是由调用该变量时候的位置确定,举例如下:
var v="out";
function outside(){
var v="in";
return inside();
}
function inside(){
return v;
}
outside();
比较
var v="out";
function outside(){
var v="in";
function inside(){
return v;
}
return inside();
}
outside();
第一段代码的执行结果是"out",而第二段代码的执行结果是"in"。
区别的关键就在于inside()函数的定义位置,第一段代码inside()函数定义在outside()函数的外层,因此该函数内使用的v变量的作用域链只包含inside()内和顶层,因此它的值为"out",而第二段代码的inside()函数定义在outside()函数内部,此时该函数使用的v变量作用域链包含了inside()函数内部,outside()函数内部以及顶层,并且是按顺序查找的,所以此时v的值为outside()内部赋值的"in"。