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中找,直到找到栈底。
求大神指点下
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论