[英]How to comprehend clause 10.5 in ECMA-262 5.1 Edition?
最近,我读到有关ES5规范的信息,在第10章中有一个关于执行上下文的困惑。 更确切地说,混淆存在于10.5 [ https://ecma-international.org/ecma-262/5.1/#sec-10.5 ]中。
第10.5条名为“声明绑定实例化” ,它说明了如何生成执行上下文的 VariableEnvironment组件。 在项目5 iii中, Im感到困惑的是:“如果existProp。[[Configurable]]是true ...”。
这样做的目的是什么, 为什么在调用全局对象的[[DefineOwnProperty]]时未定义PropertyDescriptor。[[Value]] ,以及如何使用真实的javascript代码来证明这一步骤?
也许这是一个错误? 这里的[[Value]]应该是声明的函数对象?
当在顶层声明一个函数时,它首先检查该属性名是否存在于全局对象上。 如果该属性不存在,则:
C。 令funcAlreadyDeclared为通过fn作为参数调用env的HasBinding具体方法的结果。
d。 如果funcAlreadyDeclared为false,则调用fn和configurableBindings作为参数,调用env的CreateMutableBinding具体方法。
否则,它将进入e.
您正在查看的部分:
即 否则,如果env是全局环境的环境记录组件,则:...
因此,在该e.
任何位置e.
, funcAlreadyDeclared
必然是true
-属性已经被定义,剩下的就是要检查是否该属性是可变的。 PropertyDescriptor.[[Value]]
将必须返回完整的属性描述符,因为在e.
,我们知道该属性确实存在; 该块仅在funcAlreadyDeclared
为true
运行。
在顶层,它检查属性是否可配置,如果是,则在全局对象上设置关联的属性。 例如,顶层function foo(){}
将导致定义window.foo
,并且本节检查是否可以定义window.foo
。
具有true
configurable
性意味着 :
当且仅当此属性描述符的类型可以更改并且该属性可以从相应对象中删除时,才返回true。
例如, window.top
是不可配置的,因此[[DefineOwnProperty]]
将不会运行:
console.log(Object.getOwnPropertyDescriptor(window, 'top'));
因此,尝试在top
声明一个名为top
的函数将引发错误:
function top() { }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.