2014-10-07 75 views
2

我的目標是遍歷函數列表,並依次調用每個函數。我想避免一個匿名函數,但我有一個很難搞清楚我錯了(使用下劃線,但原則應該是相當類似的,無論)調用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))) 
+2

您只傳遞'.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

+0

這個解釋很棒。我只是通過申請。我的理解是正確的,通過綁定,每個實際上都會爲每個項目調用Function.call(參數)? – Ben 2014-10-07 05:06:16

+0

是的,但是'.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

回答

1

你可以試試這個:

_.each([wait, more], function(f){ f(); }); 

甚至這樣的:

_.each([wait, more], function(f){ f.call(); }); 

更新:那就試試這個:

_.each([wait, more], Function.prototype.call, Function.prototype.call) 

綁定使用第三個參數的背景下,like this。檢查the doc

+0

我的目標是避免匿名功能。在更深層次上,我想了解爲什麼Function.prototype.call.apply不能用作_.each的回調函數 – Ben 2014-10-07 04:33:49

+0

歡迎您:-) – 2014-10-07 05:08:13