let和const都能够声明块级作用域,用法和var是类似的,let的特点是不会变量提升,而是被锁在当前块中。
console.log(a) // a is not defined
let a = 1
if(true) {
let b = 1
var c = 2
}
console.log(b) // b is not defined
console.log(c) // 2
console.log(d) //c is undefined
var d = 1
let不允许在同一作用域里进行重复声明同一个变量,在同一个作用域里,如果使用var进行声明变量,后面会覆盖前面的 .
const一般用来声明常量,一但声明,其值就不能更改,意味着const一旦声明常量,就必须同时初始化。不能先声明,后初始化,这样会报错
与let一样。const声明的常量也只在块级作用域内有效
与let一样,必须先声明,后使用
与let一样,在同一作用域,const不能重复声明同一常量
const a = 5
a = 20
console.log(a)//Uncaught SyntaxError: Identifier 'a' has already been declared
const虽然是常量,不允许修改默认赋值,但如果定义的是对象Object,那么可以修改对象内部的属性值。
const obj= {
a: 10
}
obj.a = 100 //没有直接修改obj的值,而是修改obj.a的属性值,这是允许的。
console.log(obj) // {a: 100}
var声明的变量为全局变量(被誉为JS最大设计缺陷之一)
var声明的变量没有块级作用域,既会污染全局变量,也使循环中的异步代码不能如意执行
for(var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i) //5, 5, 5, 5, 5
}, 0)
}
console.log(i) //5 i跳出循环体污染外部函数
//将var改成let之后
for(let i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i) // 0,1,2,3,4
}, 0)
}
console.log(i)//i is not defined i无法污染外部函数
在实际开发中,我们选择使用var、let还是const,取决于我们的变量后面是否需要修改,通常一些不希望被修改的变量,使用const。当你需要修改声明的变量值时,使用let,var能用的场景都可以使用let替代。