执行栈与执行上下文

142 阅读1分钟

写在前面:执行上下文是JavaScript执行环境的抽象概念,例如:在执行某函数时,函数执行的环境包括:作用域,变量对象等。在执行时将执行上下文压入栈中,若里面还包含执行上下文继续压栈,执行完毕后出栈。这个栈就是执行栈。

经典题目加深对执行栈的理解

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

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

我的理解是,一个是return f() 一个是return f,前者先执行函数再弹出,后者先弹出再执行函数。

所以在执行function f()时,执行栈的内容不同,前者由于先执行再弹出,其执行栈还有checkscope,而后者没有。

除此之外函数的上下文都相同

延伸------>闭包

上例的函数f就是一个闭包

在B中:在函数checkscope已经出栈(上下文销毁)的情况下,仍然访问得到起作用域下变量scope

为什么能访问呢?上下文不是已经销毁了吗?

不要忘记,虽然上下文已经销毁,但是在f的作用域链中还保存了checkscope的AO(activity Object)信息,变量scope在函数f中有使用,还处于活跃状态,没有被清除,存在于内存中

待补充:作用域链的构建过程

参考文章:一道js面试题引发的思考 · Issue #18 · kuitos/kuitos.github.io

JavaScript深入之闭包 · Issue #9 · mqyqingfeng/Blog (github.com)