为什么这段代码创建了对象,但仍将其视为未定义?

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.objprop 的存在(并且由于 TypeError 未定义而失败 TypeError),那么它不应该评估 IIFE ,不应创建 window.obj.

我观察到 window.obj 被创建 并且 TypeError 被抛出,这对我来说没有意义。


备注:

我错了。这甚至应该在 评估 rhs 之前抛出异常。这是引擎中的错误(或者至少是与规范的偏差)。参见 https://es.discourse.group/t/rhs-evaluation-in-assignment-to-unresolvable-reference/310


That's just how it works:

  1. 左侧被评估为参考
  2. 右侧被计算为一个值
  3. 值为put in the reference,如果引用无法解析其基值
  4. ,则会引发错误

我不知道他们为什么在评估右侧之前不费心检查参考,但是这种行为与 setter 属性 投掷一致。