ECMA-262 5.1 小节 10.4.210.4.2.1 请参阅“呼叫上下文”。这似乎没有在文档中的其他任何地方进行描述。

引用规范,强调我的:

10.4.2 输入评估代码

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

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

10.4.2.1 严格模式限制

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

  • 这些段落中的“调用上下文”是什么意思?我假设它指的是 执行上下文 就在之前的堆栈顶部 eval 叫做;任何人都可以验证这一点吗?

  • 没有“没有呼叫上下文”意味着什么?有人可以提供可能导致呼叫的代码或条件的示例 eval 没有调用上下文?

有帮助吗?

解决方案

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

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

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

ES-Discuss 邮件列表中的一个非常相似的问题澄清了这一点,其中 布伦丹·艾奇 (JavaScript 的创建者)回应:

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

ES3 说:

10.2.2 评估代码

当控件输入评估代码的执行上下文时,先前的活动执行上下文(称为调用上下文)用于确定范围链,变量对象和该值。如果没有呼叫上下文,则可以执行该值的范围链,可变实例化和确定该值的确定。

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

回复:

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

有些浏览器支持间接 eval, ,允许这样:

setTimeout(eval, 0, "alert('hi mom')");

使用的窗口是其中的窗口 setTimeout 是沿示波器链发现的,所以

myFrame.setTimeout(eval, 0, "alert(x)");

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top