zlx362211854 / daily-study

每日一个知识点总结,以issue的形式体现
10 stars 6 forks source link

72. var c = d = 'xx' 这样声明变量有什么问题? #114

Open zlx362211854 opened 5 years ago

goldEli commented 5 years ago
var c = d = 'xx' 

console.log(c, d) // xx xx

JavaScript是从右向左开始执行,所以 c 和 d 赋予了相同的值。

好像等效于 var d = "xx",然后 var c = d,其实并不是。看下面的测试

function test() {
  var c = d = 'xx' 
}
test()
console.log(d) // xx
function test() {
  var d = 'xx' 
  var c = d
}

console.log(d) // d is not defined

连等于写法让 d 挂载到了 window 上。

var c = d = 'xx' 

// 等效于 =>

var c = (window.d = 'xx')

结论:连等写法会造成全局污染。

Reference

Multiple left-hand assignment with JavaScript

nanslee commented 5 years ago

连等写法遵循从右向左的赋值规律,故 :

var c = d = 'xx' 

// 等效于 =>

var c = (window.d = 'xx');

这种在局部赋值时尤其注意

zlx362211854 commented 5 years ago

我们知道,js中函数是一个独立的作用域,所以有时候我们在函数内部写代码的时候就容易放飞自我,写出这种代码:

function a() {
  var c = d = 123
}
console.log(c) // undefined
console.log(d) // 123

很少注意到上面var c = d = 123代码,造成了全局污染。 var c = d = 123这条语句,其实分解一下,就变成这样:

function a() {
 var d = 123;
 c = d;
}

这样,d是由var声明的,有局部作用域,但是c没有通过var声明,变成了全局变量,所以造成了全局污染,即便是在函数内部也是一样。