JavaScript閉包中的循環

創建閉包(closures)的方式:在一個函數內部創建另一個函數

閉包:函數內部的函數有權訪問函數作用域的變量

實例1:

 for(var i = 0; i < 10; i++) {
    setTimeout(function() {
      console.log(i);  
    }, 10);
}
分析:輸出結果爲10次10。setTimeout函數是異步函數,會在當前的調用棧完成後執行,即循環完成之後執行。閉包內部引用的是外部變量i,i的值爲10,因此,輸出結果都是10;


實例2:

for(var i = 0; i < 10; i++) {
    setTimeout((function(num) {
      console.log(num);
    })(i), 10)
}
分析:通過創建IIFE(自執行函數表達式)讓結果輸出1-9;

它會創建一個作用域,將i傳遞進去。此時,i是一個局部變量,(不再是在閉包中引用i)。

實例3:


function createFunctions(){
	var result=[];
	for (var i = 0; i < 10; i++) {
		result[i]=function(){
			return i;
		};
	}
	return result;
}

var arr=createFunctions();	
console.log(arr);

for (var i = 0; i < arr.length; i++) {
	console.log(arr[i]());
}
分析:結果爲10次10;
實例四:

function createFunctions(){
	var result=[];
	for (var i = 0; i < 10; i++) {		

		result[i]=(function(num){
			return num;
		})(i);
		
	}
	return result;
}

var arr=createFunctions();	
console.log(arr);

分析:輸出結果爲[0,1,2,3,4,5,6,7,8,9];


歡迎指正!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章