1.理解js的链式作用域的前提
1)首先要知道js的变量作用域,js的变量作用域就两种:全局和局部
2)js中当前作用域能访问其上层作用域的变量和函数
2.js链式作用域的定义:
JS权威指南的描述:
JavaScript中的函数运行在他们被定义的作用域里,而不是他们被执行的作用域里。
这句话很难理解,但是换做简单的描述,JS的链式作用域就是:
JS中当遇到对变量名或者函数名的使用时,会首先在当前作用域查找变量或者函数,如果没有找到,就会到其上层作用域中寻找,并以此类推。
下面这个例子在很多博文中引用:
var x = 10;
function test() {
alert(x);
}
test();
上面例子中弹出的值是什么? 答案是10,这个很好理解,因为上面提到:
2)js中上层对象中的变量和函数对其子对象都是可见的
下面对这个例子稍微变换下:
var x = 10;
function test() {
alert(x);
var x = 2;
}
test();
改变后的例子弹出的值是什么?答案是undefined,如果用java等其他编程语言的思维分析很理解,但利用JS链式作用域来理解,函数test在执行时,会先在其本身的作用域中寻找,而函数本中是定义了x的,就不会在向上层寻找,但是是定义在alert之后,因此alert会弹出undefined,如果函数内没有定义x,就像最初的例子,那么就会在其上层作用域寻找,就是10