为了账号安全,请及时绑定邮箱和手机立即绑定

关于Eval的执行上下文,出入上下文堆栈 ECStack 的疑问

关于Eval的执行上下文,出入上下文堆栈 ECStack 的疑问

料青山看我应如是 2019-03-12 09:10:48
先引用原文深入理解JavaScript系列(11):执行上下文(Execution Contexts)eval 代码有点儿意思。它有一个概念: 调用上下文(calling context),例如,eval函数调用的时候产生的上下文。eval(变量或函数声明)活动会影响调用上下文(calling context)。eval('var x = 10'); (function foo() {  eval('var y = 20');})(); alert(x); // 10alert(y); // "y" 提示没有声明ECStack的变化过程:ECStack = [  globalContext]; // eval('var x = 10');ECStack.push(  evalContext,  callingContext: globalContext); // eval exited contextECStack.pop(); // foo funciton callECStack.push(<foo> functionContext); // eval('var y = 20');ECStack.push(  evalContext,  callingContext: <foo> functionContext); // return from evalECStack.pop(); // return from fooECStack.pop();以eval('var x = 10');为例,当控制器进入Eval函数时,会向ECStack push两个元素:evalContext、callingContext:globalContext,此时的 ECStack中有3个元素吧,ECStack = [ globalContext, evalContext, CallingContext:globalContext ]我的疑问是:// eval exited contextECStack.pop();这一步会弹出一个CallingContext:globalContext,还是弹出CallingContext:globalContext,evalContext两个元素?我认为应该弹出两个元素,但我记得pop只能操作一个元素吧,这样 evalContext 还会留在 ECStack 里呢。
查看完整描述

1 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

不是你的问题,是翻译的问题,你可以看那个博客的原文,原文push的是一个对象,这个对象有两个属性,一个context,一个callingContext,所以pop一次就够了:

https://img1.sycdn.imooc.com//5ca311c800012fca07840750.jpg

查看完整回答
反对 回复 2019-04-02
  • 1 回答
  • 0 关注
  • 1007 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信