【问题标题】:How to comprehend clause 10.5 in ECMA-262 5.1 Edition?如何理解 ECMA-262 5.1 版中的第 10.5 条?
【发布时间】:2019-07-19 07:26:51
【问题描述】:

最近我读到了 ES5 规范,在 Chapter-10 中有一个困惑,那就是关于 Execution Context。更确切地说,混淆存在于 10.5[https://ecma-international.org/ecma-262/5.1/#sec-10.5]。

第10.5条名为Declaration Binding Instantiation,它解释了Execution Context的组件VariableEnvironment是如何生成的。我困惑的地方是item-5-iii:“如果existingProp .[[Configurable]] 为真...”。

这样做的目的是什么,为什么调用全局对象的[[DefineOwnProperty]]时PropertyDescriptor.[[Value]]是未定义的,以及如何用真实的javascript代码证明这一步?

或者这是一个错误?这里的 [[Value]] 应该是声明的函数对象吧?

【问题讨论】:

    标签: javascript ecmascript-5


    【解决方案1】:

    当函数在顶层声明时,它首先检查全局对象上是否存在属性名称。如果该属性不存在,则:

    c。让 funcAlreadyDeclared 成为调用 env 的 HasBinding 具体方法并传递 fn 作为参数的结果。

    d。如果 funcAlreadyDeclared 为 false,则调用 env 的 CreateMutableBinding 具体方法,传递 fn 和 configureBindings 作为参数。

    否则,它会进入您正在查看的e. 部分:

    e。否则,如果 env 是全局环境的环境记录组件,那么:...

    因此,e.funcAlreadyDeclared 内部的任何位置都必须是 true - 属性 已定义,剩下的就是检查该属性是否可以更改。 PropertyDescriptor.[[Value]] 必然返回一个完整的属性描述符,因为在e. 内部,我们知道该属性确实存在;该块仅在 funcAlreadyDeclaredtrue 时运行。

    在顶层,它检查属性是否可配置,如果是,则在全局对象上设置关联的属性。例如,顶层的function foo(){} 将导致window.foo 被定义,此部分检查window.foo 是否可以定义。

    拥有configurabletrue means

    当且仅当此属性描述符的类型可以更改并且可以从相应对象中删除该属性时才为真。

    例如,window.top 是不可配置的,所以[[DefineOwnProperty]] 将不会运行:

    console.log(Object.getOwnPropertyDescriptor(window, 'top'));

    因此,尝试在顶层声明一个名为 top 的函数会引发错误:

    function top() {
    }

    【讨论】:

    • e.里面,当属性是可配置的,然后在声明函数的全局对象上设置关联属性,为什么[[Value]]不是函数对象?
    • 出于某种原因,规范将属性的定义与将值分配给属性分开。这就像它首先在f. 中创建值为undefined 的属性,然后然后调用env 的SetMutableBinding 具体方法,传递fn、fo 和strict 作为参数。),分配函数值。
    猜你喜欢
    • 1970-01-01
    • 2013-12-30
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多