我的目標是遍歷函數列表,並依次調用每個函數。我想避免一個匿名函數,但我有一個很難搞清楚我錯了(使用下劃線,但原則應該是相當類似的,無論)調用Function.prototype.call.apply內循環
function wait() {
console.log("wait")
}
function more() {
console.log("more")
}
_.each([wait, more], Function.prototype.call.apply)
不幸的是,這樣的錯誤。
Uncaught TypeError: Function.prototype.apply was called on undefined, which is a undefined and not a function
我相信這是由於迭代器func被稱爲有三個參數(項目,指標,陣列)和Function.prototype.call.apply需要空在這種情況下,第二個參數,不索引。
當我嘗試這一點,失敗,新的錯誤
_.each([wait, more], _.partial(Function.prototype.call.apply, _, null))
Uncaught TypeError: Function.prototype.apply was called on [object Window], which is a object and not a function
最後,這個工程
unary = function(func) {
return function(a) {
return func.apply(a);
};
};
_.each([wait, more], unary(_.partial(Function.prototype.call)))
您只傳遞'.apply',它與'.call'沒有任何關係,除非您實際調用它,而不是傳遞它。所以你需要使用'.bind()'來保證這種關係......'_.each([wait,more],Function.apply.bind(Function.call))',但這是不對的,因爲你迭代數組,而不是傳遞它。因此,你需要'_.each([wait,more],Function.call.bind(Function.call))',這會工作。 – 2014-10-07 04:33:35
這個解釋很棒。我只是通過申請。我的理解是正確的,通過綁定,每個實際上都會爲每個項目調用Function.call(參數)? – Ben 2014-10-07 05:06:16
是的,但是'.call'有一個綁定的'this',所以它有效地做了'Function.call.call(arguments [0],arguments [1],arguments [2])',其中參數是'項目,我,陣列'。所以'Function.call.call(item,i,array)'就像'item.call(i,array)',所以如果你在函數中記錄'this'和第一個參數,那應該是你得到。 – 2014-10-07 05:24:16