let
let是ES6定義的新關(guān)鍵詞宙暇,用于聲明變量榕茧,例如:
let a = 1
console.log(a) //1
let聲明的變量不能重復(fù)聲明,例如:
let a = 1
let a = 2 //Identifier 'a' has already been declared
let也可以不用初始化客给,例如:
let a;
console.log(a)// undefined
let是塊級(jí)作用域,可以解決for循環(huán)中變量泄露的問(wèn)題肢簿,例如:
var arr = []
for(var i = 0; i < 10; i++) {
arr.push(function() {console.log(i)})
}
arr.forEach(function(arr){
arr() //打印10次10
})
上面為什么輸出10次10呢靶剑?因?yàn)闉樽兞?i 在循環(huán)的每次迭代中都被共享了,意味著循環(huán)內(nèi)創(chuàng)建的那些函數(shù)都擁有對(duì)于同一 變量的引用池充。在循環(huán)結(jié)束后桩引,變量 i 的值會(huì)是 10 ,因此當(dāng) console.log(i) 被調(diào)用時(shí)收夸, 每次都打印出 10 坑匠。
現(xiàn)在用let改寫這個(gè)例子:
var arr = []
for(let i = 0; i < 10; i++) {
arr.push(function() {console.log(i)})
}
arr.forEach(function(arr){
arr() //0-9
})
為什么let可以解決這個(gè)問(wèn)題呢?因?yàn)樵诿看蔚形韵В琹et都會(huì)創(chuàng)建一個(gè)新的同名變量并對(duì)其進(jìn)行初始化厘灼。在循環(huán)中 let 聲明每次都創(chuàng)建了一個(gè)新的 i 變量,因此在循環(huán)內(nèi)部創(chuàng)建的函數(shù)獲得了各自的 i 副 本咽瓷,而每個(gè) i 副本的值都在每次循環(huán)迭代聲明變量的時(shí)候被確定了设凹。