if条件下的对象破坏导致全局变量?

时间:2018-02-26 12:27:58

标签: javascript scope variable-assignment destructuring hoisting

有人可以向我解释为什么我可以访问" m"在以下场景的全局范围内:

const a = {m: 'beeb'};


const magic = function topLevel () {
   function lowerLevel() {
    if ({m} = a ) { 
      console.log('in lowerLevel-func: ', m);
    }
  }

  lowerLevel();
}


magic();

console.log('in global', m);

这里是JSFiddle

编辑:只是为了澄清,我没有在任何地方使用它,我只是想知道它是如何可能的。现在我知道了,谢谢!

1 个答案:

答案 0 :(得分:1)

您观察到此行为是因为您正在对以前未声明的变量进行分配,而您正在非严格模式下执行代码。

该行:

if ({m} = a ) { 

实际上是将变量m的{​​{1}}字段分配给变量a。现在因为m之前没有声明过,也没有在全局范围内存在,所以会发生两件事:

  • 在非严格模式下退化为m的分配,使其在全球范围内可用
  • 在严格模式下,您会收到参考错误。
Imo最后的行为应该是你应该定位的行为,因为它是(imo)最少的"令人惊讶的"之一。