深切明白JavaScript (4) —— 从自在变量到作用域链

自在变量:如果在某个作用域中使用了变量“a”,而变量“a”并未在该作用域中声明(在别的作用域中声清楚明了),则该变量“a”即为自在变量。

var a = 1;
function fn() {
    var b = 2;
    console.log( a + b);    //变量a即为一个自在变量
}

上述代码中,取b的值就直接可以在fn作用域中取,由于b就是在这里定义的。而取x的值时,就需要到另一个作用域中取。到哪一个作用域中取呢?

有人说,要到父作用域中取,实在有时候这类诠释会发生歧义。比方:

var a = 1;
function fn() {
    console.log(a);
}

function show(f) {
    var a = 2;
    (function () {
        f();    //1,而不是2
    })();
}

show(fn);

上述代码的实行效果申明“要到父作用域中取”这句话并不正确,更贴切的说法是:要到建立这个被实行函数(此处为fn)的谁人作用域(此处为全局作用域,由于fn是在全局作用域中建立的)中取值 是“建立”,而不是“挪用”,牢记牢记——实在这就是所谓的“静态作用域”。换言之,此处终究实行的函数是fn,而自在变量是a,因而要到建立fn的作用域中去找a的值。

存在如许的可以,在建立fn的作用域中并未找到自在变量a,此时怎么办呢?那就再到该作用域的上一级作用域中寻觅,如若还没有,就继承向上找,直至找到全局作用域,若依旧未找到,就会报“a is not defined!”。可以沿着作用域一级级向上寻觅的机制就称为“作用域链”。

    原文作者:Jerry
    原文地址: https://segmentfault.com/a/1190000009368865
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞