Javascript “a”是什么;调用上下文;
ECMA-262 5.1小节,并参考“调用上下文”。该文档中其他地方似乎没有对此进行描述 引用规范,强调我的: 10.4.2输入评估代码 当控件进入eval代码的执行上下文时,将执行以下步骤:Javascript “a”是什么;调用上下文;,javascript,ecma262,Javascript,Ecma262,ECMA-262 5.1小节,并参考“调用上下文”。该文档中其他地方似乎没有对此进行描述 引用规范,强调我的: 10.4.2输入评估代码 当控件进入eval代码的执行上下文时,将执行以下步骤: 如果没有调用上下文,或者没有通过直接调用eval函数(15.1.2.1.1)来计算eval代码,则 10.4.2.1严格的模式限制 如果调用上下文的代码或eval代码是严格代码,则eval代码无法在调用eval的调用上下文的变量环境中实例化变量或函数绑定。相反,这些绑定是在一个新的VariableEnvi
- 在这些段落中,“调用上下文”是什么意思?我假设它是指在调用
之前堆栈顶部的;有人能证实这一点吗eval
- “无调用上下文”是什么意思?有人能提供一个代码或条件的示例,它可能导致在没有调用上下文的情况下调用
eval
eval
函数的上下文
如果您是从某个本机代码执行eval
(例如,出于某种原因,您运行一个本机函数,该函数在使用eval
完成时执行代码),则它将没有上下文,然后指定该上下文在全局范围下运行。上下文仅引用ECMAScript可执行代码
然而,调用上下文指的是被调用的执行上下文中的变量和指令。例如,它只知道如果检查调用上下文,eval将作为严格的代码工作
ES讨论邮件列表中的一个非常类似的问题澄清了这一点,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
在这个例子中指的是框架的全局范围。这听起来对我来说是正确的,尽管我认为“全局范围”部分是关闭的;全局作用域有一个执行上下文(“当控件被传输到ECMAScript可执行代码时,控件正在输入一个执行上下文。”)。关于执行上下文只应用于脚本的优点;例如,控制台可能在没有调用上下文的情况下调用eval
。这可能是一个“你的猜测和我的一样好”的场景,不幸的是,因为规范中没有关于“调用上下文”的明确描述。让我们看看是否会弹出任何其他答案。@DaggNabbit:我认为在严格模式部分中使用它的位置更清楚,这就是我的想法。哇,ES3对于调用上下文实际上是什么更为具体。我想我感觉到另一个问题正在酝酿。如果你对这篇文章投了反对票,你能解释一下我如何改进这篇文章或者它有什么问题吗?谢谢这个答案是可靠和正确的。不管是谁否决了它,一定是因为你个人的愤怒