在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 求解這兩個輸出區(qū)別?

求解這兩個輸出區(qū)別?

const Greeters = []
for (var i = 0 ; i < 10 ; i++) {
  Greeters.push(function () { return console.log(i) })
}
Greeters[0]() // 10
Greeters[1]() // 10
Greeters[2]() // 10
const Greeters = []
for (let i = 0 ; i < 10 ; i++) {
  Greeters.push(function () { return console.log(i) })
}
Greeters[0]() // 0
Greeters[1]() // 1
Greeters[2]() // 2

第二個用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)}]?

回答
編輯回答
孤星

典型面試題,變量生命周期問題,for循環(huán)問題和函數(shù)形參問題。
let和var的不同,var是在當前代碼塊結(jié)束之后仍然在內(nèi)存保留該變量和值,而let則是不保留,直接回收。
而for循環(huán)輸出是等到循環(huán)全部結(jié)束。
所以第一種全部都是10。
而第二種方式不是undefined呢,很簡單,用到了閉包,注意這里返回的不是值,而是函數(shù),如果第二種直接輸出,那就是undefined,但是現(xiàn)在返回函數(shù),我們還記得函數(shù)的形參嗎,沒錯,函數(shù)調(diào)用時形參是對實參的一個復(fù)制,所以在輸出時實參雖然被回收了,但是形參還保留了值。所以JS中循環(huán)取值和輸出的最簡單解決方式就是閉包。

2017年10月22日 02:44
編輯回答
尤禮

第一種情況,我覺得相當于這樣:

var i;
function print() {
    return console.log(i);
}
const Greeters = []
for (i = 0 ; i < 10 ; i++) {
  Greeters.push(print);
}
console.log(`Now i=${i}`);// 注意這里i = 10;
Greeters[0]() // 10
Greeters[1]() // 10
Greeters[2]() // 10

第二組情況,let 活動范圍僅限于for循環(huán)中,那么每次把函數(shù)加入到數(shù)組中時,i傳遞了當前的i值,

function () { 
    return console.log(i);
}
2018年9月14日 17:14