2014-07-05 23 views

回答

7

數組也是JavaScript對象。在你的情況下,你創建了一個數組和三個屬性,即f1,f2f3。相反,你可以簡單地做

var myFunctions = [ 
    function(i) { 
     return i + 2 
    }, 
    function(i) { 
     return i * 2 
    }, 
    function(i) { 
     return i - 3 
    } 
]; 

現在,我們有一個函數數組,我們可以使用Array.prototype.reduce功能,應用這些功能,這樣

var result = myFunctions.reduce(function(result, currentFunction) { 
    return currentFunction(result); 
}, n); 

n要傳遞的實際初始值到要應用的功能列表。 reduce取初始值和第一個函數,分別作爲resultcurrentFunction傳遞它們。我們在result上應用currentFunction並返回值。在下一次迭代中,返回的值將是result,而currentFunction將是第二個函數,依此類推。

如果你不喜歡這個功能的方法,你可以簡單地用一個for循環,這樣

var i = 0, result = 0, n = 10; 
for (var i = 0; i < myFunctions.length; i += 1) { 
    n = myFunctions[i](n); 
} 
4

使用倍(減少):

var n = 5; 

var myFunctions = [ 
    function (i) {return i + 2}, 
    function (i) {return i * 2}, 
    function (i) {return i - 3} 
]; 

n = myFunctions.reduce(function(n, fn) { return fn(n) }, n); 

n; // => 11 ((5 + 2) * 2 - 3) 

使用function composition

var myFunctions = [ 
    function (i) {return i - 3}, 
    function (i) {return i * 2}, 
    function (i) {return i + 2} 
]; 

_.compose.apply(null, myFunctions)(5); // => 11 

注意,在本第二示例中的功能是按照相反的順序,按照慣例,鏈中的最後一個函數首先被應用。

相關問題