题
ECMA-262 5.1 小节 10.4.2 和 10.4.2.1 请参阅“呼叫上下文”。这似乎没有在文档中的其他任何地方进行描述。
引用规范,强调我的:
10.4.2 输入评估代码
当控制进入 eval 代码的执行上下文时,将执行以下步骤:
- 如果没有 调用上下文 或者如果 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
在本例中指的是框架的全局范围。