素胚勾勒不出你
2018-08-10 09:06:58
在看阮老師的ECMAScript 6 入門 時遇到了這個問題。先貼代碼 :var a = [];for (var i = 0; i < 10; i++) {
a[i] = function () { console.log(i);
};
}
a[6](); // 10不理解為什么是10,書中是這樣解釋的。變量i是var聲明的,在全局范圍內(nèi)都有效。所以每一次循環(huán),新的i值都會覆蓋舊值,導(dǎo)致最后輸出的是最后一輪的i的值。先假設(shè)是覆蓋了,那為什么是10,為什么不是9, 不是 i < 10 嗎?還有這個let的用法var a = [];for (let i = 0; i < 10; i++) {
a[i] = function () { console.log(i);
};
}
a[6](); // 6let聲明 i , 就得到了6,這是為什么???書中是這樣解釋的。變量i是let聲明的,當(dāng)前的i只在本輪循環(huán)有效,所以每一次循環(huán)的i其實都是一個新的變量,所以最后輸出的是6。整理下問題 :1.用var聲明的為什么結(jié)果是10,就算不是6,也該是9啊,因為循環(huán)是從0-9.2.用let聲明的為什么是6?
1 回答

梵蒂岡之花
TA貢獻1900條經(jīng)驗 獲得超5個贊
1 這個問題跟var let沒關(guān)系,10是因為循環(huán)到9以后,js并不知道循環(huán)結(jié)束了,還會進行下一次循環(huán),i加一等于10,然后判斷條件發(fā)現(xiàn)不滿足,才跳出循環(huán)。
2 var i你想象成全局變量,每次循環(huán)修改的、函數(shù)里面console.log訪問的,都是同一個i。a[6]()是在循環(huán)結(jié)束后執(zhí)行的,這時候的i由第一問知道是10。
let i你想象成局部變量,每次循環(huán)都生成一個新的,函數(shù)里面console.log訪問的也都是不同的i。下面這段代碼可能對你有點繞,但理解后對你學(xué)習(xí)js的變量很有幫助:
for (var i=0;i<10;i++) { a[i]=(function(i){ return function() { console.log(i); })(i); } a[6](); // 6
循環(huán)變量i傳到一個立即執(zhí)行函數(shù)里,變成了局部變量i(其實這個函數(shù)的參數(shù)可以任意取名,取成i為了加深你的理解),在這個局部變量的作用域內(nèi)定義了一個函數(shù)引用了它,js就會把它作為函數(shù)的上下文保存起來,所以console.log得到的是0到9不同的值。
添加回答
舉報
0/150
提交
取消