【问题标题】:JavaScript - "implementation-defined object"JavaScript - “实现定义的对象”
【发布时间】:2013-01-15 14:41:40
【问题描述】:

我正在阅读“JavaScript:权威指南,第 6 版”,并在“3.10.3 范围链”部分(第 55 页)中指出 -

“如果我们将局部变量视为某种属性 实现定义的对象,那么还有另一种方式来考虑变量范围。”

有人能解释一下“实现定义的对象”是什么意思吗?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    想想一个没有暴露给我们的抽象对象。它由实现定义,并且仅对实现可用——“实现”表示将运行您的代码的 JavaScript 引擎。

    例如,考虑以下函数:

    function f(a,b) {
        var foo = 5;
        return a + b + foo;
    }
    

    在该函数范围内定义的变量和参数可以表示为如下所示的对象:

    {
        a,
        b,
        foo
    }
    

    对象属性的值可以在函数执行期间发生变化。例如,如果使用f(1,2) 调用函数,函数执行开始时对象将如下所示:

    {
        a: 1,
        b: 2,
        foo: undefined
    }
    

    foo 分配给5 后,将如下所示:

    {
        a: 1,
        b: 2,
        foo: 5
    }
    

    将此对象视为在函数内部声明。因此,您可以在函数内部访问abfoo 的值,但不能在函数外部访问。

    【讨论】:

    • 这是对您引用的句子的外行术语解释。基于语言规范的技术解释请参考James Allardice's answer
    • James 的回答远远超出我的想象,bfavaretto。非常感谢您的“外行”回答。我的投票给你!
    • @ABogus 没问题!我希望我的回答能帮助您理解 James 的规范和规范,如果您以后决定更深入地研究它们的话。此外,我的最后两个示例旨在向您提示“变量提升”的工作原理:)。
    【解决方案2】:

    局部变量在内部表示为与词法环境的绑定,如规范所示(ES5 10.5 - 请注意,以下引用中的“env”指的是当前作用域的词法环境):

    • 对于 code 中的每个 VariableDeclarationVariableDeclarationNoIn d,按源文本顺序执行

      • dn成为d中的标识符

      • varAlreadyDeclared 成为调用 env's HasBinding 具体方法并传递 dn 作为参数的结果。

        李>
      • 如果 varAlreadyDeclared 为假,则

        • 调用 env 的 CreateMutableBinding 具体方法,传递 dnconfigurableBindings 作为参数。

        • 调用 env 的 SetMutableBinding 具体方法,传递 dn、未定义和 strict 作为参数。

    由于您无法以编程方式访问作用域的词法环境,因此您看不到这些绑定。但这意味着您可以将局部变量视为这个不可见对象的属性,就像全局变量成为全局对象的属性(您可以访问)。

    在上面引用的部分的开头很好地总结了这个概念:

    每个执行上下文都有一个关联的变量环境。在执行上下文中评估的 ECMAScript 代码中声明的变量和函数作为绑定添加到该变量环境的环境记录中。

    要更详细地了解该过程,请查看specification of the CreateMutuableBinding and setMutableBinding 方法。

    为了回答您的实际问题,在这种情况下,“实现定义的对象”是当前执行上下文的词法环境。

    【讨论】:

    • 非常感谢您的回复,詹姆斯。但是,我只是一个外行,我不知道你在说什么!但是……我会把尝试理解你的它作为我的人生使命!谢谢!
    • @ABogus - 没问题,希望将来你能理解它。如果你能坚持下去,规范是一个很好的学习工具,但要通过它确实需要一些努力!
    • 顺便说一句 - 我的意思是“我将努力理解 !”
    猜你喜欢
    • 1970-01-01
    • 2015-09-07
    • 2023-01-10
    • 2014-10-05
    • 2012-01-06
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多