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

先引用原文

深入理解JavaScript系列(11):执行上下文(Execution Contexts)

eval 代码有点儿意思。它有一个概念: 调用上下文(calling context),例如,eval函数调用的时候产生的上下文。eval(变量或函数声明)活动会影响调用上下文(calling context)。

eval('var x = 10');

 

(function foo() {

  eval('var y = 20');

})();

 

alert(x); // 10

alert(y); // "y" 提示没有声明

ECStack的变化过程:


ECStack = [

  globalContext

];

 

// eval('var x = 10');

ECStack.push(

  evalContext,

  callingContext: globalContext

);

 

// eval exited context

ECStack.pop();

 

// foo funciton call

ECStack.push(<foo> functionContext);

 

// eval('var y = 20');

ECStack.push(

  evalContext,

  callingContext: <foo> functionContext

);

 

// return from eval

ECStack.pop();

 

// return from foo

ECStack.pop();

以eval('var x = 10');为例,当控制器进入Eval函数时,会向ECStack push两个元素:evalContext、callingContext:globalContext,

此时的 ECStack中有3个元素吧,

ECStack = [ globalContext, evalContext, CallingContext:globalContext ]


我的疑问是:

// eval exited context

ECStack.pop();

这一步会弹出一个CallingContext:globalContext,还是弹出CallingContext:globalContext,evalContext两个元素?

我认为应该弹出两个元素,但我记得pop只能操作一个元素吧,这样 evalContext 还会留在 ECStack 里呢。


料青山看我应如是
浏览 1008回答 1
1回答

牛魔王的故事

不是你的问题,是翻译的问题,你可以看那个博客的原文,原文push的是一个对象,这个对象有两个属性,一个context,一个callingContext,所以pop一次就够了:
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript