鍍金池/ 問答/HTML/ 關(guān)于Eval的執(zhí)行上下文,出入上下文堆棧 ECStack 的疑問

關(guān)于Eval的執(zhí)行上下文,出入上下文堆棧 ECStack 的疑問

先引用原文

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

eval 代碼有點兒意思。它有一個概念: 調(diào)用上下文(calling context),例如,eval函數(shù)調(diào)用的時候產(chǎn)生的上下文。eval(變量或函數(shù)聲明)活動會影響調(diào)用上下文(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');為例,當(dāng)控制器進入Eval函數(shù)時,會向ECStack push兩個元素:evalContext、callingContext:globalContext,
此時的 ECStack中有3個元素吧,
ECStack = [ globalContext, evalContext, CallingContext:globalContext ]

我的疑問是:
// eval exited context
ECStack.pop();
這一步會彈出一個CallingContext:globalContext,還是彈出CallingContext:globalContext,evalContext兩個元素?
我認為應(yīng)該彈出兩個元素,但我記得pop只能操作一個元素吧,這樣 evalContext 還會留在 ECStack 里呢。

回答
編輯回答
慢半拍

不是你的問題,是翻譯的問題,你可以看那個博客的原文,原文push的是一個對象,這個對象有兩個屬性,一個context,一個callingContext,所以pop一次就夠了:

clipboard.png

2018年4月4日 03:41