天天看點

立即執行函數封裝變量

立即執行函數在執行前進行預編譯時,也會生成一個AO。可利用此特性,儲存循環過程中的變量,以便循環結束後使用這個變量。

案例:

需求:編寫一個長度為10的數組,儲存10個函數,這些函數的功能依次是在控制台輸出0,2..,9.

思路:使用for循環往數組裡添加函數

原理:閉包可以封裝變量

錯誤寫法:

<script type="text/javascript">
	function test(){
		var arr = [];
		for(var i = 0;i < 10 ;i++){
			arr[i] = function(){
				console.log(i);
			}
		}
		return arr;
	}
	var myArr = test();
	myArr[0]();
	myArr[1]();
	myArr[2]();
	myArr[3]();
	myArr[4]();
</script>
           

這樣寫數組裡面的函數和test形成閉包,輸出結果是5個10,因為test函數執行結束,i的值變成了10,當調用myArr[0]時,console.log(i);通路的i值是10,其它也都是10

正确寫法:

<script type="text/javascript">
	function test(){
		var arr = [];
		for(var i = 0;i < 10 ;i++){
			(function(j){
				arr[j] = function(){
				console.log(j);
			}
			}(i))
		}
		return arr;
	}
	var myArr = test();
	myArr[0]();
	myArr[1]();
	myArr[2]();
	myArr[3]();
	myArr[4]();
</script>
           

每個立即執行函數都有一個獨立的AO,調用myArr[0]和myArr[5]通路的j位于不同的AO中,如下圖所示

立即執行函數封裝變量