- let和const是块级作用域,var是函数式作用域
- let和const必须先定义后使用,var允许变量声明提前
1. let 的作用域在最近的{}之间
2. 如果你在 let a 之前使用 a, 那么报错
3. 如果你重复let a ,那么报错
const
1. 2. 3. 同上
4. 只有一次赋值机会,且要在声明的时候立马赋值
var的bug
- var定义的变量,其作用域是函数体的全部。
for(var i=0;i<10;i++){
var a = 'a';
}
console.log(a); // 'a'
跳出for循环了还可以访问到for循环里定义的变量
- 循环内变量过度共享
for(var i = 0;i < 3;i++){
setTimeout(function(){
console.log(i);
},3000)
}
会输出3个3,而不是预想的0、1、2
let是更完美的var
let就是用来解决上边两个bug的。
- let声明的变量拥有块级作用域
也就是说let声明的变量的作用域只是外层块,而不是整个外层函数。let声明的变量仍保留了提升特性但不会盲目提升。 - 形如for (let x...)的循环在每次迭代时都为x创建新的绑定
比如改进例二 - let声明的全局变量不是全局对象的属性
这意味着我们不能通过window.变量名的形式访问这些变量。 - let重复定义变量会报错
const是用来定义常量的
const定义的变量在声明时就必须赋值
网友评论