Javascript “a”是什么;调用上下文;

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

ECMA-262 5.1小节,并参考“调用上下文”。该文档中其他地方似乎没有对此进行描述

引用规范,强调我的:

10.4.2输入评估代码

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

  • 如果没有调用上下文,或者没有通过直接调用eval函数(15.1.2.1.1)来计算eval代码,则
  • 10.4.2.1严格的模式限制

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

    • 在这些段落中,“调用上下文”是什么意思?我假设它是指在调用
      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对于调用上下文实际上是什么更为具体。我想我感觉到另一个问题正在酝酿。如果你对这篇文章投了反对票,你能解释一下我如何改进这篇文章或者它有什么问题吗?谢谢这个答案是可靠和正确的。不管是谁否决了它,一定是因为你个人的愤怒