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

发布于 2022-09-07 20:18:13 字数 1113 浏览 33 评论 0

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

问题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中找,直到找到栈底。

求大神指点下

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文