为什么这段代码创建了对象,但仍将其视为未定义?
Why does this code create the object, but still treats it as undefined?
我不明白为什么这段代码没有按预期工作:
"use strict";
window.obj.prop = (() => {
window.obj = { myobj: true };
return "value";
})();
我一直认为 =
运算符首先计算它右边的任何东西(这个片段中的 IIFE),然后将结果分配给它左边的任何东西(window.obj.prop
在这个片段中)。不过看起来这里发生了一些不同的事情。
如果解释器首先计算 IIFE,那么它应该在设置其 .prop
之前创建 window.obj
,这不应导致 TypeError
。另一方面,如果解释器首先检查 window.obj
中 prop
的存在(并且由于 TypeError
未定义而失败 TypeError
),那么它不应该评估 IIFE ,不应创建 window.obj
.
我观察到 window.obj
被创建 并且 TypeError
被抛出,这对我来说没有意义。
备注:
"use strict"
在 "just in case" 中抛出,代码段在没有它的情况下工作类似;
- 该代码段在浏览器 (Chrome 80.0) 和 Node.js (v13.3) 中的工作方式相同;
window.obj
(或 Node 中的 global.obj
)对象在此片段之前不存在 运行;
我错了。这甚至应该在 在 评估 rhs 之前抛出异常。这是引擎中的错误(或者至少是与规范的偏差)。参见 https://es.discourse.group/t/rhs-evaluation-in-assignment-to-unresolvable-reference/310。
- 左侧被评估为参考
- 右侧被计算为一个值
- 值为put in the reference,如果引用无法解析其基值
,则会引发错误
我不知道他们为什么在评估右侧之前不费心检查参考,但是这种行为与 setter 属性 投掷一致。
我不明白为什么这段代码没有按预期工作:
"use strict";
window.obj.prop = (() => {
window.obj = { myobj: true };
return "value";
})();
我一直认为 =
运算符首先计算它右边的任何东西(这个片段中的 IIFE),然后将结果分配给它左边的任何东西(window.obj.prop
在这个片段中)。不过看起来这里发生了一些不同的事情。
如果解释器首先计算 IIFE,那么它应该在设置其 .prop
之前创建 window.obj
,这不应导致 TypeError
。另一方面,如果解释器首先检查 window.obj
中 prop
的存在(并且由于 TypeError
未定义而失败 TypeError
),那么它不应该评估 IIFE ,不应创建 window.obj
.
我观察到 window.obj
被创建 并且 TypeError
被抛出,这对我来说没有意义。
备注:
"use strict"
在 "just in case" 中抛出,代码段在没有它的情况下工作类似;- 该代码段在浏览器 (Chrome 80.0) 和 Node.js (v13.3) 中的工作方式相同;
window.obj
(或 Node 中的global.obj
)对象在此片段之前不存在 运行;
我错了。这甚至应该在 在 评估 rhs 之前抛出异常。这是引擎中的错误(或者至少是与规范的偏差)。参见 https://es.discourse.group/t/rhs-evaluation-in-assignment-to-unresolvable-reference/310。
- 左侧被评估为参考
- 右侧被计算为一个值
- 值为put in the reference,如果引用无法解析其基值 ,则会引发错误
我不知道他们为什么在评估右侧之前不费心检查参考,但是这种行为与 setter 属性 投掷一致。