js中闭包中执行环境需要出栈吗?作用域链是怎么实现的?

作用域链,闭包的题目虽然会做会画图,但是都是抽象层面上的
具体到实现上我还存在一些问题

问题1: 闭包中执行环境需要出栈吗
大家看下面这个函数

 function A(i) {
    return function (n) {
        console.log(n + i);  //xf0地址指向堆内存 储存函数function(n){console.log(n + i);}
    } } 
    var B = A(10);  //时刻0    执行后B=xfo
     B(20);

时刻0 A执行的时候,栈中 windowscontext-Acontext
A执行完,有闭包,A的context不销毁
但是,Ac该不该出栈?(我认为还是应该出栈的)
再执行B(20)的时候 B入栈之前,A该不该入栈(或者本身就没出)
也就是此时的栈是wc-Ac-Bc还是Wc-Bc

为什么问第一个问题,因为我对作用域的实现有两种猜测,拿不准

问题2:
有两个猜测:1.储存在每个执行环境中的变量对象里面(也就是作用域链是个实际存在的对象),
2.没有作用域链这个变量(也就没有储存),根据执行栈的执行环境顺序来自动获取需要的变量,这种机制叫做作用域链(也就是作用域链是个虚的不存在的东西)
做个解释:

var a = 1    //时刻0
function A () {
    B()      //时刻2
    function B(){
        a = 10    
    }
}
A()   //时刻1
console.log(10)

时刻0,windows执行环境入栈,
时刻1,A执行环境入栈,
时刻2,B执行环境入栈,
此时栈里面 栈底--windowscontext--Acontext--Bcontext--Ccontext--栈顶
如果说是情况1,在Ccontext中存在variable object中存在一个属性记录了作用域链。它这个原理好像也不怎么好实现
如果说是情况2 作用域仅仅是个概念,没有作用域这种实际东西,我访问a就是先在Ccontext中的variable object访问,没有一步一步往栈底的context的variable object中找,直到找到栈底。

求大神指点下

阅读 1.5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题