先引用原文
深入理解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 里呢。
牛魔王的故事
相关分类