標籤:閉包 javascript
之前看到一段代碼,很是不能理解,然後就尋找資料並且找網路上得大牛請教,最後弄懂了這段代碼,然後就拿出來總結一下。
1.挖坑
先來看一段代碼:
var arrTest = [];for (var i = 0; i < 3; i++) { //注意函數沒有傳參數進入函數體 arrTest.push(function () { console.log(‘>>>‘ + i); })}//arrTest=[function(){console.log(‘>>>‘+i)}, function(){console.log(‘>>>‘+i)}, function(){console.log(‘>>>‘+i)}]console.log(arrTest[0].toString()); //function(){console.log(‘>>>‘,+i)}console.log(i);console.log(‘-------------‘);//長度可以使用l 簡單的單詞來代替,減小代碼長度for (var i = 0, arrLength = arrTest.length; i < arrLength; i++) { console.log(i); arrTest[i]();}//驗證的i的值console.log(‘i的值是‘ + i); //i=3console.log(‘end for‘);for (var j = 0, arrLength = arrTest.length; j < arrLength; j++) { console.log(j); arrTest[j]();}arrTest = [function () { console.log(‘>>>‘ + i) }, function () { console.log(‘>>>‘ + i) }, function () { console.log(‘>>>‘ + i) }]
結果是這個樣子的:
那怎麼實現當遍曆整個函數的時候列印出我們所希望的0,1,2這樣的結果呢?
/*對函數進行改造,當執行迴圈的時候,列印0,1,2 */var arrTest1 = [];for (var i = 0; i < 3; i++) { //構造一個立即執行的函數將函數的返回結果添加入數組中 (function(n) { arrTest1.push(function() { console.log(‘>>>‘ + n); }); })(i);}console.log(arrTest1);for (var i = 0, l = arrTest1.length; i < l; i++) { arrTest1[i]();}
列印結果:
javascript閉包問題詳解