Javascript 如何理解ECMA-262 5.1版第10.5条?
最近我读到了关于ES5规范的内容,在第10章中有一个关于执行上下文的混淆。更确切地说,10.5[]中存在混淆 名为声明绑定实例化的第10.5条解释了执行上下文的组件VariableEnvironment是如何生成的。我混淆的是项-5-iii:“如果existingProp。[[Configurable]]为true…” 这样做的目的是什么,为什么在调用全局对象的[[DefineOwnProperty]]时未定义PropertyDescriptor。[[Value]],以及如何用真正的javascript代码证明这一步骤Javascript 如何理解ECMA-262 5.1版第10.5条?,javascript,ecmascript-5,Javascript,Ecmascript 5,最近我读到了关于ES5规范的内容,在第10章中有一个关于执行上下文的混淆。更确切地说,10.5[]中存在混淆 名为声明绑定实例化的第10.5条解释了执行上下文的组件VariableEnvironment是如何生成的。我混淆的是项-5-iii:“如果existingProp。[[Configurable]]为true…” 这样做的目的是什么,为什么在调用全局对象的[[DefineOwnProperty]]时未定义PropertyDescriptor。[[Value]],以及如何用真正的javasc
或者这是个错误?此处[[Value]]应该是声明的函数对象?在顶层声明函数时,它首先检查全局对象上是否存在属性名。如果该属性不存在,则: c。让funcalreadydecared成为调用env的HasBinding具体方法并将fn作为参数传递的结果 d。如果funcAlreadyDeclared为false,则调用env的CreateMutableBinding具体方法,将fn和configurableBindings作为参数传递 否则,它将进入您正在查看的
e.
部分:
e。否则,如果env是全局环境的环境记录组件,则:
因此,在e.
中的任何地方,functionalreadydecared
都必须是true
-属性已经定义,剩下的是检查属性是否可以更改。PropertyDescriptor.[Value]
必须返回完整的属性描述符,因为在e.
中,我们知道属性确实存在;仅当funcalreadydecared
为true
时,该块才会运行
在顶层,它检查属性是否可配置,如果可配置,则在全局对象上设置关联属性。例如,顶层的函数foo(){}
将导致定义window.foo
,本节检查是否可以定义window.foo
具有真实的可配置的:
当且仅当此属性描述符的类型可以更改,并且该属性可以从相应对象中删除时,为true
例如,window.top
是不可配置的,因此[[DefineOwnProperty]]
将不会运行:
console.log(Object.getOwnPropertyDescriptor(窗口“top”)
在e.
中,当属性是可配置的,然后在具有声明函数的全局对象上设置关联属性时,[[Value]]为什么不是函数对象?出于某种原因,规范将属性的定义与属性的值赋值分离开来。就像它首先使用值undefined
创建属性,然后在f.
中(调用env的SetMutableBinding具体方法,将fn、fo和strict作为参数传递),分配函数值。