與var命令的對(duì)比,以及l(fā)et的一些特性
1.let聲明的變量只能在let命令所在代碼區(qū)塊中生效
// var
for(var i = 0; i < 5; i++){
}
console.log(i) // 5
// let
for(let i = 0; i < 5; i++){ // 這個(gè)i只能在這個(gè)for循環(huán)內(nèi)使用
}
console.log(i) // 報(bào)錯(cuò):i is not defined
2.let不存在變量提升
console.log(a) // undefined
console.log(b) // 報(bào)錯(cuò):b未定義
var a = 1
let b = 1
3.因?yàn)閘et不存在變量提升,所以會(huì)有暫時(shí)性死區(qū)
什么是暫時(shí)性死區(qū)滋戳?
暫時(shí)性死區(qū)就是在這個(gè)區(qū)塊中的變量未聲明之前,對(duì)該區(qū)塊中的變量的一切調(diào)用都會(huì)報(bào)錯(cuò)
a = 1
let a = 2
// 以上代碼會(huì)報(bào)錯(cuò)
a = 1
{let a = 2}
// 以上代碼不會(huì)報(bào)錯(cuò),因?yàn)槁暶髯兞康膮^(qū)塊不一
4.let聲明的變量不能重復(fù)進(jìn)行聲明
let a = 1
var a = 1 // 報(bào)錯(cuò) a已經(jīng)被聲明
const a = 1 // 報(bào)錯(cuò) a已經(jīng)被聲明
let的使用實(shí)例
因?yàn)閘et命令的出現(xiàn),所以JS有了塊級(jí)作用域咬崔,原本因?yàn)樽饔糜騿栴}導(dǎo)致的閉包問題也可以使用let嗎,清零進(jìn)行解決,比如以下經(jīng)典閉包代碼會(huì)一次性輸出5個(gè)5垮斯,但需求是輸出01234
for(var i = 0; i < 5; i++){
setTimeout(function(){
console.log(i)
}, 1000)
}
1.ES6之前的解決辦法郎仆,使用一個(gè)變量對(duì) i 的值進(jìn)行暫存
for(var i = 0; i < 5; i++){
(function(e){
setTimeout(function(){
console.log(e)
}, 1000)
})(i)
}
2.出現(xiàn)let后的解決辦法
for(let i = 0; i < 5; i++){
setTimeout(function(){
console.log(i)
}, 1000)
}
關(guān)于for循環(huán)作用域的問題
在for循環(huán)中實(shí)際上是有兩個(gè)作用域的,條件設(shè)置的圓括號(hào)()內(nèi)是一個(gè)父作用域兜蠕,而代碼塊大括號(hào){}中是一個(gè)子作用域扰肌,比如下面代碼可以進(jìn)行區(qū)分
for(let i = 0; i < 5; i++){
let i = 8
console.log(i)
}
// 輸出結(jié)果是5個(gè)8