javascript中用 var 声明变量,存在以下问题:
- 声明的变量为全局变量(被誉为JS最大设计缺陷之一):
var a = 123;
console.log(window.a); // 123
这造成了在开发大型项目或引入三方库时,很容易覆盖已有变量。
- 变量提升:
console.log(a); // undefined
var a = 1;
这种奇异的行为会让正常思维的人很困惑。
- 变量可被重复声明:
var a = 1;
console.log(a); // 1
var a = 2;
console.log(a); // 2
- 没有「块级作用域」的概念:
if (true) {
var a = 1;
}
console.log(a); // 1
for (var i = 0; i < 1; i++) {
var a = 5;
// ...
}
console.log(i); // 1
console.log(a); // 5
没有块级作用域,既会污染全局变量,也使循环中的异步代码不能如意执行:
for (var i = 0; i < 3; i++) {
console.log('for: ' + i);
setTimeout(() => {
console.log('setTimeout: ' + i);
})
}
// for: 0
// for: 1
// for: 2
// ③ setTimeout: 3
以上问题,在开发中很容易引起各种bug,让初学者摸不着头脑。
而 let 则将以上问题统统解决了!
网友评论