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

问题描述 投票:1回答:1

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

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

    return "value";
})();

enter image description here

[我一直认为=运算符首先评估它右边的任何内容(此片段中的IIFE),然后将结果赋给它左边的任何内容(此片段中的window.obj.prop)。看起来这里有些不同。

如果解释器首先评估IIFE,则它应在设置其window.obj之前创建.prop,这不会导致TypeError。另一方面,如果解释器首先检查prop中是否存在window.obj(并由于TypeError未定义而失败window.obj),则它不应评估IIFE,因此不应创建window.obj ]。

[我观察到两个window.obj均被创建 TypeError被抛出,这对我来说没有意义。


注意:

  • "use strict"以“以防万一”的方式出现,该片段在没有它的情况下也类似地工作;
  • 该代码段在浏览器(Chrome 80.0)和Node.js(v13.3)中均相同;
  • 在运行此代码段之前,window.obj(或Node中的global.obj)对象不存在;
javascript global shared-memory iife use-strict
1个回答
1
投票

That's just how it works

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

我不知道为什么他们在评估右侧之前不麻烦检查参考,但是此行为与setter属性抛出的一致。

© www.soinside.com 2019 - 2024. All rights reserved.