最近,我了解了ES5规范,在第10章中有一个关于执行上下文的困惑。更确切地说,混淆存在于10.5 [https://ecma-international.org/ecma-262/5.1/#sec-10.5]中。
第10.5节名为声明绑定实例化,它说明了执行上下文的组件 VariableEnvironment 的生成方式。 >项目5-iii :“如果existingProp。[[Configurable]]为true ...”。
这是什么目的,为什么在调用全局对象的[[DefineOwnProperty]]时未定义PropertyDescriptor。[[Value]] ,以及如何使用真实的javascript代码来证明这一步骤? / p>
也许这是一个错误?这里的[[Value]]应该是声明的函数对象吗?
答案 0 :(得分:2)
在顶层声明一个函数时,它将首先检查该属性名称是否在全局对象上存在。如果该属性不存在,则:
c。令funcAlreadyDeclared为通过fn作为参数调用env的HasBinding具体方法的结果。
d。如果funcAlreadyDeclared为false,请调用env的CreateMutableBinding具体方法,并将fn和configurableBindings作为参数。
否则,它将进入您正在查看的e.
部分:
e。否则,如果env是全局环境的环境记录组件,则:...
因此,e.
,funcAlreadyDeclared
内的任何地方都必定是true
-属性已经已经定义,剩下的就是检查是否属性是可变的。 PropertyDescriptor.[[Value]]
将必然返回完整的属性描述符,因为在e.
内部,我们知道该属性确实存在;该块仅在funcAlreadyDeclared
为true
时运行。
在顶层,它检查属性是否可配置,如果是,则在全局对象上设置关联的属性。例如,顶层的function foo(){}
将导致定义window.foo
,并且本节将检查是否可以定义window.foo
。
具有configurable
means中的true
:
当且仅当可以更改此属性描述符的类型并且可以从相应对象中删除该属性时,才为true。
例如,window.top
是不可配置的,因此[[DefineOwnProperty]]
将不会运行:
console.log(Object.getOwnPropertyDescriptor(window, 'top'));
因此,尝试在顶层声明一个名为top
的函数将引发错误:
function top() {
}