【JavaScript】牛客程式設計:使用閉包實現函式 makeClosures
阿新 • • 發佈:2018-12-18
呼叫之後滿足如下條件: 1、返回一個函式陣列 result,長度與 arr 相同 2、執行 result 中第 i 個函式,即 resulti,結果與 fn(arr[i]) 相同 我第一次寫法是這樣的:
function makeClosures(arr, fn) { var result = [] arr.forEach(function(item, index) { result.push(function(item) { return fn(item) }) }) return result }
這種寫法,你在push的時候其實只是建立一個函式物件,並沒有執行:
function(item) {
return fn(item)
}
當迭代停止時,item為最終迭代停止的值,在函式被呼叫時,item依舊為最終迭代停止的值,因此無法返回正確的結果。
為了解決這個問題,需要宣告一個匿名函式,並立即執行它。
function(num){
return function(){
return fn(num);
};
}(i)
函式執行後,i立即傳入並被內部函式訪問到,因此就能得到正確的結果。
正確程式碼如下:
function makeClosures(arr, fn) { var result = [] arr.forEach(function(item, index) { result.push(function(item) { return function() { return fn(item) } }(item) ) }) return result }