轉化一個數字數組爲function數組(每一個function都彈出相應的數字)

湯姆大叔的博客裏看到了6個基礎題目:本篇是第2題 - 轉化一個數字數組爲function數組(每一個function都彈出相應的數字)javascript

此題關鍵點:html

一、如何將一個匿名函數存入數組?java

二、如何鎖住須要調用的值?數組

 

解點1:如何將一個匿名函數存入數組?

var arr = [];
arr[0] = function() { alert('ok'); }

如上,arr[0]即爲一個函數,可用arr[0]()進行調用。下面是初步實現的代碼:閉包

var arr = [9,8,7,6];
function toFunctionArray(arr) {
    for(var i=0; i<arr.length; i++) {
        var v = arr[i];
        arr[i] = function() {
            alert( v );
        };
    }
}
toFunctionArray(arr);
for(var i=0; i<arr.length; i++) {
    arr[i]();
}

以上代碼,看起來沒毛病,可是運行就會發現彈出4次 6。爲什麼會如此?請繼續看解點2函數

 

解點2:如何鎖住須要調用的值?

在toFunctionArray函數中的for循環會執行4次,循環結束後,v的值是6(第4個元素的值),即轉換後的數組中的每個元素老是alert了同一個v。如何讓每一個函數調用不一樣的v呢?解決這個問題的辦法就是把v的值傳遞給匿名函數,代碼以下:spa

var arr = [9,8,7,6];
function toFunctionArray(arr) {
    for(var i=0; i<arr.length; i++) {
        var v = arr[i];
        arr[i] = function(v) {
            alert( v ); //每一個v都保存了不一樣的值
        }(v); //注意此處的v做爲匿名函數的參數
    }
}
toFunctionArray(arr);
for(var i=0; i<arr.length; i++) {
    arr[i]();
}

若是此處不太明白,請了解javascript變量的做用域、js內存回收機制、閉包等概念。code

 

-------------------------------------------- 解題完畢的分割線 -------------------------------------------htm

 

此外,可用數組的forEach來實現,會變得比較直觀,代碼以下:blog

var arr = [9,8,7,6];
function toFunctionArray(arr) {
    arr.forEach( function(v, i, arr) {
        arr[i] = function() {
            alert( v );
        }
    } );
}
toFunctionArray(arr);
arr.forEach( function(v, i, arr) {
    arr[i]();
} );

關於此法,再也不詳解,此題結束!

相關文章
相關標籤/搜索