var中的變數提升
阿新 • • 發佈:2018-11-10
之前只知道var存在的變數提升,但不知道其原理是什麼?
最近看了《深入理解es》 中明白了
當我們寫迴圈的時候
var funcs = [];
for(var i=0; i< 10; i++){
funcs.push(function() {
console.log(i)
})
}
funcs.forEach(function(func) {
func(); // 輸出10次數字10
})
是因為迴圈裡每次迭代同時共享著變數i,迴圈內部建立的函式全部保留了對相同變數的引用
迴圈結束時,變數i為10,故每次輸出都是10
當我們把迴圈改為如下時:
for (var i=0; i< 10; i++){
funcs.push((function(value){
return function(){
console.log(value)
}
}(i)))
}
輸出結果為 0 到 9
這是因為,在迴圈內部,IIFE表示式為接受的每一個變數i都建立了一個副本並存儲為變數value,這個值就是相應迭代建立函式所使用的值,因此呼叫每個函式都會像從0到9循一樣得到期望的值。