【问题标题】:Object destructing in if-condition results in global variable?if条件中的对象解构导致全局变量?
【发布时间】:2018-08-05 21:52:42
【问题描述】:
有人可以向我解释为什么我可以在以下情况下在全局范围内访问“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
编辑:澄清一下,我没有在任何地方使用它,我只是想知道它是怎么可能的。现在我知道了,谢谢!
【问题讨论】:
标签:
javascript
scope
variable-assignment
destructuring
hoisting
【解决方案1】:
如果你给一个没有被声明的变量赋值,它会自动变成一个全局变量。既然你在做=(Assigning) 而不是==(compairing)
<!DOCTYPE html>
<html>
<body>
<p>
If you assign a value to a variable that has not been declared, it will automatically become a GLOBAL variable:
</p>
<p id="demo"></p>
<script>
myFunction();
// code here can use carName as a global variable
document.getElementById("demo").innerHTML = "I can display " + carName;
function myFunction() {
carName = "Volvo";
}
</script>
</body>
</html>
References
另请阅读What is the scope of variables in JavaScript?
【解决方案2】:
发生这种情况是因为您从未显式声明(使用 var、let 或 const 语句)m 变量,因此它成为全局 Window 对象的属性(这就是您可以从代码中的任何位置)。如果您打算在 if 语句中为 m 赋值而不是进行比较,这就是解释。
请注意,如果您在严格模式下执行相同操作,则不会出现这种行为,因为它不允许使用从未声明过的变量。
【解决方案3】:
您观察到这种行为是因为您正在对以前未声明的变量进行赋值并且您正在以非严格模式执行代码。
行:
if ({m} = a ) {
实际上是将变量a 的m 字段分配给变量m。现在因为 m 之前没有被声明过,也不存在于全局范围内,所以可能会发生两件事:
- 在非严格模式下,这会退化为对
window['m'] 的赋值,使其全局可用
- 在严格模式下会出现引用错误。
Imo 最后一个行为应该是您应该定位的行为,因为它是 (imo) 最不“令人惊讶”的行为。