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的调用上下文的变量环境中实例化变量或函数绑定是严格的代码。相反,此类绑定在新的VariableEnvironment中实例化,该环境只能由eval代码访问。
这些段落中的“呼叫上下文”是什么意思?我会假设它在调用eval
之前引用堆栈顶部的Execution Context;任何人都可以验证这个吗?
“没有呼叫上下文”是什么意思?有人可以提供一个代码或条件的示例,这些代码或条件可能导致调用eval
而没有调用上下文吗?
答案 0 :(得分:3)
“调用上下文”指的是调用本机eval
函数的上下文。
如果从某些本机代码执行eval
(例如,运行本机函数,当由于某种原因使用eval
完成时执行代码),那么它将没有上下文,然后指定在全局范围内运行。上下文仅涉及ECMAScript可执行代码。
但是,调用上下文是指调用它的执行上下文中的变量和指令。例如,它只知道如果它检查调用上下文,eval就可以作为严格的代码工作。
ES-Discuss邮件列表中的一个非常类似的问题澄清了这一点,其中 Brendan Eich (JavaScript的创建者)回应:
ES3说:
10.2.2评估代码
当控件进入执行上下文时 eval代码,前面的活动执行上下文,简称为 调用上下文,用于确定范围链,变量 对象和这个值。如果没有调用上下文,那么 初始化范围链,变量实例化和 正如全局代码一样执行该值的确定。
我对“如果没有调用上下文”感到困惑。怎么可能的 可能出现?如果没有人调用它,
eval
如何被调用?
来自本机代码的调用,即“主机”程序。
有些浏览器支持间接
eval
,允许这样做:setTimeout(eval, 0, "alert('hi mom')");
使用的窗口是沿着
setTimeout
找到的窗口 范围链,所以myFrame.setTimeout(eval, 0, "alert(x)");
应该显示
myFrame.x
,而不是调用框架或窗口的x
。
注意:此实例中的myFrame
引用框架的全局范围。