0

我不明白为什么这段代码不能按预期工作:

"use strict";
window.obj.prop = (() => {
    window.obj = { myobj: true };

    return "value";
})();

在此处输入图像描述

我一直认为=运算符首先评估它右边的任何东西(这个片段中的 IIFE),然后将结果分配给它左边的任何东西(window.obj.prop在这个片段中)。看起来这里发生了一些不同的事情。

如果解释器首先评估 IIFE,那么它应该window.obj在设置它之前创建.prop,这不应该导致TypeError. 另一方面,如果解释器首先检查 in 的存在propwindow.obj并且TypeError由于window.obj未定义而失败),那么它不应该评估不应该创建的 IIFE window.obj

我观察到两者都是window.obj被创建 TypeError被抛出的,这对我来说没有意义。


笔记:

  • "use strict"在“以防万一”的情况下,该片段的工作方式类似,没有它;
  • 该片段在浏览器(Chrome 80.0)和 Node.js(v13.3)中的工作方式相同;
  • 在运行此代码段之前window.obj(或global.obj在节点中)对象不存在;
4

1 回答 1

2

我错了。即使在评估 rhs之前,这也应该引发异常。这是引擎中的一个错误(或至少是与规范的偏差)。请参阅https://es.discourse.group/t/rhs-evaluation-in-assignment-to-unresolvable-reference/310


这就是它的工作原理

  1. 左侧被评估为参考
  2. 右侧被评估为一个值
  3. 该值被放入引用中,如果引用无法解析其基值,则会引发错误

我不知道为什么他们在评估右侧之前不检查引用,但是这种行为与 setter 属性抛出一致。

于 2020-04-17T10:48:06.647 回答