比方說,我有存儲在數組中的功能列表:的JavaScript:先後調用一個對象上的函數列表
var myFunctions = [
function (i) {return i + 2},
function (i) {return i * 2},
function (i) {return i - 3}
]
什麼將陸續把所有這些功能的對象,即最好的辦法因此得到((n + 2) * 2) - 3
?
答案使用外部庫等Underscore歡迎:)
比方說,我有存儲在數組中的功能列表:的JavaScript:先後調用一個對象上的函數列表
var myFunctions = [
function (i) {return i + 2},
function (i) {return i * 2},
function (i) {return i - 3}
]
什麼將陸續把所有這些功能的對象,即最好的辦法因此得到((n + 2) * 2) - 3
?
答案使用外部庫等Underscore歡迎:)
數組也是JavaScript對象。在你的情況下,你創建了一個數組和三個屬性,即f1
,f2
和f3
。相反,你可以簡單地做
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
取初始值和第一個函數,分別作爲result
和currentFunction
傳遞它們。我們在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);
}
使用倍(減少):
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)
var myFunctions = [
function (i) {return i - 3},
function (i) {return i * 2},
function (i) {return i + 2}
];
_.compose.apply(null, myFunctions)(5); // => 11
注意,在本第二示例中的功能是按照相反的順序,按照慣例,鏈中的最後一個函數首先被應用。