Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何理解ECMA-262 5.1版第10.5条?_Javascript_Ecmascript 5 - Fatal编程技术网

Javascript 如何理解ECMA-262 5.1版第10.5条?

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

最近我读到了关于ES5规范的内容,在第10章中有一个关于执行上下文的混淆。更确切地说,10.5[]中存在混淆

名为声明绑定实例化的第10.5条解释了执行上下文的组件VariableEnvironment是如何生成的。我混淆的是项-5-iii:“如果existingProp。[[Configurable]]为true…”

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


或者这是个错误?此处[[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作为参数传递),分配函数值。