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

Javascript 为什么这段代码创建了对象,但仍然将其视为未定义的对象?,javascript,global,shared-memory,iife,use-strict,Javascript,Global,Shared Memory,Iife,Use Strict,我不明白为什么这段代码不能按预期工作: “严格使用”; window.obj.prop=(()=>{ window.obj={myobj:true}; 返回“值”; })(); 我一直认为,=操作符首先计算它右边的任何内容(本代码段中的IIFE),然后将结果分配给它左边的任何内容(本代码段中的window.obj.prop)。看起来这里发生了一些不同的事情 如果解释器首先评估IIFE,那么它应该在设置其.prop之前创建window.obj,这不应该导致类型错误。另一方面,如果口译员首先检查

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

“严格使用”;
window.obj.prop=(()=>{
window.obj={myobj:true};
返回“值”;
})();

我一直认为,
=
操作符首先计算它右边的任何内容(本代码段中的IIFE),然后将结果分配给它左边的任何内容(
本代码段中的window.obj.prop
)。看起来这里发生了一些不同的事情

如果解释器首先评估IIFE,那么它应该在设置其
.prop
之前创建
window.obj
,这不应该导致
类型错误
。另一方面,如果口译员首先检查
window.obj
中是否存在
prop
(并且由于
window.obj
未定义而导致
TypeError
失败),那么它不应该评估IIFE,IIFE不应该创建
window.obj

我观察到的是,创建了
window.obj
,并抛出了
TypeError
,这对我来说毫无意义


注:

  • “使用严格的”
    在“以防万一”中抛出,代码段在没有它的情况下也可以类似地工作
  • 该代码段在浏览器(Chrome80.0)和Node.js(v13.3)中的工作原理相同
  • 在运行此代码段之前,
    window.obj
    (或节点中的
    global.obj
    )对象不存在
      我错了。这应该在评估rhs之前抛出异常。这是引擎中的一个bug(或者至少是与规范的偏差)。看


      :

    • 左侧将评估为参考
    • 右侧将计算为一个值
    • 值为,如果引用无法解析其基值,则会引发错误

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

      我错了。这应该在评估rhs之前抛出异常。这是引擎中的一个bug(或者至少是与规范的偏差)。看


      :

    • 左侧将评估为参考
    • 右侧将计算为一个值
    • 值为,如果引用无法解析其基值,则会引发错误

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

      不,与所有其他操作符一样。是的,当rhs更改lhs所指内容时:-)@vatz88是的,谢谢,就像所有其他操作员一样。是的,当rhs更改lhs所指的内容时:-)@vatz88是的,谢谢您的更新!不符合规范,这很有趣,谢谢更新!不符合规范,这很有趣