7 回答

TA貢獻1862條經(jīng)驗 獲得超6個贊
1、循環(huán)中的語句是立即執(zhí)行
2、每進一次循環(huán),都會給數(shù)組第i項賦值
3、這里賦值的是個函數(shù),但函數(shù)并沒有執(zhí)行
所以循環(huán)完了是這樣的:
[
function(){console.log(i)},
function(){console.log(i)},
function(){console.log(i)},
function(){console.log(i)},
function(){console.log(i)},
function(){console.log(i)},
function(){console.log(i)}
]
//由于全局的i是10
//所以每一項打印都是10

TA貢獻1779條經(jīng)驗 獲得超6個贊
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
這里的a[i] 的意思相當于循環(huán)給a數(shù)組添加十個匿名函數(shù)function () {console.log(i);}; 你可以打印一下a你就知道了 a[i]是已經(jīng)確立的了 至于執(zhí)行a[6]相當于執(zhí)行數(shù)組中的第7個匿名函數(shù) 打印i 這時候因為使用的是var 并不會產(chǎn)生塊作用域 所以i的取值等于最外層循環(huán)結束的i值就是10

TA貢獻1757條經(jīng)驗 獲得超7個贊
不要為了學閉包而閉包, 考慮閉包能做什么... 我感覺
首先,不要相當然的認為 程序按你的想法運行, 我感覺 計算機 算是一門嚴謹?shù)目茖W。
js 詞法作用域...
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = (function (i) {
return function () {
console.log(i);
};
})(i)
}
a[6](); // 6
//

TA貢獻1806條經(jīng)驗 獲得超5個贊
我從《你不了解的JS》總結了關于如何理解閉包:
某個函數(shù)擁有上級(或上多級)作用域的引用, 就叫做閉包
當函數(shù)記住并訪問其所在的詞法作用域, 即便它是在當前詞法作用域之外執(zhí)行, 這就產(chǎn)生了閉包
閉包可以使得函數(shù)就訪問定義時的詞法作用域, 所以實際上,只要使用了回調(diào)函數(shù)就使用了閉包
配合一段經(jīng)典的面試代碼就很好理解其一:
function Timer () { let time = 1 return function () { console.log(time ++) } }
關于題主的問題,相關閉包,但主要不在“閉包”上,應該是“var與let的作用域的問題”,只有當你了解了閉包并且了解了var與let作用域的不同才能想通這兩個循環(huán)。
總結下JS的塊級作用域(偽塊級作用域):
let
try catch
IIFE
with(不推薦使用)
還有不。。記不清了
添加回答
舉報