ibeautiful
2019-02-20 18:19:42
const Greeters = []for (var i = 0 ; i < 10 ; i++) { Greeters.push(function () { return console.log(i) })}Greeters[0]() // 10Greeters[1]() // 10Greeters[2]() // 10const Greeters = []for (let i = 0 ; i < 10 ; i++) { Greeters.push(function () { return console.log(i) })}Greeters[0]() // 0Greeters[1]() // 1Greeters[2]() // 2第二個(gè)用let后面不應(yīng)該是undefined嗎。。還有為什么Greeters數(shù)組里保存的是[function () { return console.log(i)},function () { return console.log(i)},...,function () { return console.log(i)}]而不是[function () { return console.log(0)},function () { return console.log(1)},...,function () { return console.log(9)}]?
1 回答

蝴蝶不菲
TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
典型面試題,變量生命周期問(wèn)題,for循環(huán)問(wèn)題和函數(shù)形參問(wèn)題。
let和var的不同,var是在當(dāng)前代碼塊結(jié)束之后仍然在內(nèi)存保留該變量和值,而let則是不保留,直接回收。
而for循環(huán)輸出是等到循環(huán)全部結(jié)束。
所以第一種全部都是10。
而第二種方式不是undefined呢,很簡(jiǎn)單,用到了閉包,注意這里返回的不是值,而是函數(shù),如果第二種直接輸出,那就是undefined,但是現(xiàn)在返回函數(shù),我們還記得函數(shù)的形參嗎,沒(méi)錯(cuò),函數(shù)調(diào)用時(shí)形參是對(duì)實(shí)參的一個(gè)復(fù)制,所以在輸出時(shí)實(shí)參雖然被回收了,但是形參還保留了值。所以JS中循環(huán)取值和輸出的最簡(jiǎn)單解決方式就是閉包。
添加回答
舉報(bào)
0/150
提交
取消