1. 程式人生 > >【JavaScript】牛客程式設計:使用閉包實現函式 makeClosures

【JavaScript】牛客程式設計:使用閉包實現函式 makeClosures

呼叫之後滿足如下條件: 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
}