什么是“呼叫环境?”

时间:2014-01-11 05:58:22

标签: javascript ecma262

ECMA-262 5.1小节10.4.210.4.2.1指的是“调用上下文”。这似乎没有在文档中的任何其他地方描述。

引用规范,强调我的:

  

10.4.2输入评估代码

     

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

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

10.4.2.1严格模式限制

     

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

  • 这些段落中的“呼叫上下文”是什么意思?我会假设它在调用eval之前引用堆栈顶部的Execution Context;任何人都可以验证这个吗?

  • “没有呼叫上下文”是什么意思?有人可以提供一个代码或条件的示例,这些代码或条件可能导致调用eval而没有调用上下文吗?

1 个答案:

答案 0 :(得分:3)

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

如果从某些本机代码执行eval(例如,运行本机函数,当由于某种原因使用eval完成时执行代码),那么它将没有上下文,然后指定在全局范围内运行。上下文仅涉及ECMAScript可执行代码。

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

ES-Discuss邮件列表中的一个非常类似的问题澄清了这一点,其中 Brendan Eich (JavaScript的创建者)回应:

How can eval code not have a calling context?

  

ES3说:

     
    

10.2.2评估代码

         

当控件进入执行上下文时     eval代码,前面的活动执行上下文,简称为     调用上下文,用于确定范围链,变量     对象和这个值。如果没有调用上下文,那么     初始化范围链,变量实例化和     正如全局代码一样执行该值的确定。

  
     

我对“如果没有调用上下文”感到困惑。怎么可能的   可能出现?如果没有人调用它,eval如何被调用?

Response:

  

来自本机代码的调用,即“主机”程序。

     

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

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

使用的窗口是沿着setTimeout找到的窗口   范围链,所以

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

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

注意:此实例中的myFrame引用框架的全局范围。