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替代。