什么是"呼叫环境?"

Dag*_*bit 5 javascript ecma262

ECMA-262 5.1小节10.4.210.4.2.1涉及"呼叫上下文".这似乎没有在文档中的任何其他地方描述.

引用规范,强调我的:

10.4.2输入Eval代码

当控件进入eval代码的执行上下文时,执行以下步骤:

  1. 如果没有调用上下文或者eval代码没有通过直接调用(15.1.2.1.1)评估到eval函数那么,

10.4.2.1严格模式限制

如果调用上下文的代码或eval代码是严格代码,则eval代码无法在调用eval 的调用上下文的变量环境中实例化变量或函数绑定.相反,此类绑定在新的VariableEnvironment中实例化,该新的VariableEnvironment只能由eval代码访问.

  • 在这些段落中,"呼叫语境"是什么意思?我认为它指的是在调用之前的堆栈顶部的执行上下文eval ; 谁能验证这个?

  • 拥有"没有呼叫背景?"是什么意思?有人可以提供一个代码或条件的例子,可能导致调用eval没有调用上下文?

Qan*_*avy 3

“调用上下文”是指eval调用本机函数的上下文。

如果您从某些本机代码执行eval(例如,您运行一个本机函数,该函数在eval出于某种原因使用完成时执行代码),那么它将没有上下文,然后指定该上下文在全局范围内运行。上下文仅指 ECMAScript 可执行代码。

但是,调用上下文是指调用它的执行上下文中的变量和指令。例如,它仅知道如果 eval 检查调用上下文,则它应该作为严格代码工作。

ES-Discuss 邮件列表中的一个非常相似的问题澄清了这一点,Brendan Eich(JavaScript 的创建者)在其中回应:

eval 代码怎么可能没有调用上下文呢?

ES3 说:

10.2.2 评估代码

当控制进入 eval 代码的执行上下文时,先前的活动执行上下文(称为调用上下文)用于确定作用域链、变量对象和 this 值。如果没有调用上下文,则初始化作用域链、变量实例化和 this 值的确定就像全局代码一样执行。

我对“如果没有调用上下文”感到困惑。怎么会出现这种可能性呢?eval如果没人打电话怎么会被叫到呢?

回复:

来自本机代码(“主机”程序)的调用。

一些浏览器支持间接eval,允许:

setTimeout(eval, 0, "alert('hi mom')");
Run Code Online (Sandbox Code Playgroud)

setTimeout使用的窗口是沿着作用域链找到的窗口,因此

myFrame.setTimeout(eval, 0, "alert(x)");
Run Code Online (Sandbox Code Playgroud)

应该显示myFrame.x,而不是调用框架或窗口的x.

注意:myFrame在本例中指的是框架的全局范围。

  • 如果您对这篇文章投了反对票,您能否解释一下我该如何改进这篇文章或者它有什么问题?谢谢! (3认同)
  • 哇哦,ES3 对于调用上下文的实际含义“方式”更加具体。我想我感觉到另一个问题正在酝酿之中。仍在阅读本文... (2认同)
  • 这个答案是可靠且正确的。无论是谁投了反对票,一定是对你个人感到愤怒@Qantas94Heavy (2认同)