这次一定吃透-作用域和作用域链

103 阅读1分钟

作用域

作用域的分类有两种,一个静态,一个动态,静态作用域就是我们经常提到的词法作用域,也就是JavaScript采用的作用域。

要理解两者也很简单,词法作用域是在定义的时候,作用域就已经确定了。而动态作用域在函数调用的时候作用域才确定。

下面看段代码,这段代码我们已经从执行上下文的角度分析过了,最后的结果都是‘local scope’。从执行上下文的角度我们看了一遍,下面我们再从词法作用域的角度来看,输出的结果就更容易理解了。

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
checkscope();

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}
checkscope()();

作用域链

作用域链这个词我们在执行上下文的学习中已经见过了,还是分析的上面这段代码,这段代码真的太牛逼了。

上次我们看的是第一段代码,这次我们从作用域链的角度再来看看第二段代码。

这里我们需要知道函数内部有一个[[scope]]属性,函数创建的时候会保存所有的父变量对象到其中。知道了这里我们再来看代码执行的过程

大概就是这样吧,写出来都有点晕,总之这里的重点是函数内部在创建的时候,已经把作用域确定了!