Dag*_*bit 5 javascript ecma262
ECMA-262 5.1小节10.4.2和10.4.2.1涉及"呼叫上下文".这似乎没有在文档中的任何其他地方描述.
引用规范,强调我的:
10.4.2输入Eval代码
当控件进入eval代码的执行上下文时,执行以下步骤:
- 如果没有调用上下文或者eval代码没有通过直接调用(15.1.2.1.1)评估到eval函数那么,
10.4.2.1严格模式限制
如果调用上下文的代码或eval代码是严格代码,则eval代码无法在调用eval 的调用上下文的变量环境中实例化变量或函数绑定.相反,此类绑定在新的VariableEnvironment中实例化,该新的VariableEnvironment只能由eval代码访问.
在这些段落中,"呼叫语境"是什么意思?我认为它指的是在调用之前的堆栈顶部的执行上下文eval ; 谁能验证这个?
拥有"没有呼叫背景?"是什么意思?有人可以提供一个代码或条件的例子,可能导致调用eval没有调用上下文?
“调用上下文”是指eval调用本机函数的上下文。
如果您从某些本机代码执行eval(例如,您运行一个本机函数,该函数在eval出于某种原因使用完成时执行代码),那么它将没有上下文,然后指定该上下文在全局范围内运行。上下文仅指 ECMAScript 可执行代码。
但是,调用上下文是指调用它的执行上下文中的变量和指令。例如,它仅知道如果 eval 检查调用上下文,则它应该作为严格代码工作。
ES-Discuss 邮件列表中的一个非常相似的问题澄清了这一点,Brendan Eich(JavaScript 的创建者)在其中回应:
ES3 说:
10.2.2 评估代码
当控制进入 eval 代码的执行上下文时,先前的活动执行上下文(称为调用上下文)用于确定作用域链、变量对象和 this 值。如果没有调用上下文,则初始化作用域链、变量实例化和 this 值的确定就像全局代码一样执行。
我对“如果没有调用上下文”感到困惑。怎么会出现这种可能性呢?
eval如果没人打电话怎么会被叫到呢?
来自本机代码(“主机”程序)的调用。
一些浏览器支持间接
eval,允许:Run Code Online (Sandbox Code Playgroud)setTimeout(eval, 0, "alert('hi mom')");
setTimeout使用的窗口是沿着作用域链找到的窗口,因此Run Code Online (Sandbox Code Playgroud)myFrame.setTimeout(eval, 0, "alert(x)");应该显示
myFrame.x,而不是调用框架或窗口的x.
注意:myFrame在本例中指的是框架的全局范围。
| 归档时间: |
|
| 查看次数: |
1316 次 |
| 最近记录: |