也称: 词法作用域
JavaScript 查找变量关联的值时, 会遵循一个查找链, 这个链是基于作用域的层次结构的.
- var a = 'hello';
- var func1 = function(){
- var func2 = function(){
- console.log(a);
- }
- }
- //hello
如上图, 查找过程如下:
1, 在 func2 函数中查找变量 a, 如果找到了, 直接输出值, 如果没有找到, 转到第 2 步
2, 在 func2 的父函数 func1 函数中继续查找, 如果找到了, 直接输出值, 如果没有找到, 转到第 3 步
3, 继续在全局作用域中查找, 如果找到了, 直接输出值, 如果没有找到, 输出 undefined
作用域链查找 返回第一轮值. 当在作用域链内最近位置查到变量时, 查找即结束, 不管作用域链顶部是否还有相同的变量名称
- var a = 1;
- var func1 = function(){
- var a = 2;
- var func2 = function(){
- var a = 3;
- console.log(a);// 输出 3. 局部变量 a 在作用域内是第一个被查找到的, 因此不再查找其余的
- }
- }
作用域链 是根据函数定义时的位置决定的, 而不是在调用时确定的.
正因为 作用域链是在函数调用之前创建, 所以才可以创建闭包.
来源: http://www.bubuko.com/infodetail-2806798.html