1. 程式人生 > >var中的變數提升

var中的變數提升

之前只知道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循一樣得到期望的值。

 

es6中的let,const不存在上述的問題,因為其內部也模仿了上述的IIFE表示式來簡化迴圈過程