2013-05-13 56 views
5

我有點試驗_.bind(...)。我看到如何強制綁定一個函數上下文,但還沒有看到如何做currying。如何使用UnderscoreJS進行柯里化?

我嘗試是這樣的:

add = function(number) { this.sum = this.sum + number; } 
add5 = _.bind(add, { sum: 0 }, 5) 

但是,調用add5()add5(5)似乎別有一番效果。

任何線索如何包裝參數,以便上下文從一個調用保存到另一個?

+1

下劃線有一個'_.partial',我覺得你可以用來咖喱。 – 2013-05-13 11:53:34

+0

'add'和'add5' *都沒有*效果,所以你期望發生什麼? – 2013-05-13 11:59:38

+0

我期待得到一些數字:0,5,10,15,... – poseid 2013-05-13 12:00:28

回答

7

也許你想要做部分申請,不是咖喱/schönfinkeling。下劃線有這個_.partial功能:

function add(a, b) { return a+b; } 
var add5 = _.partial(add, 5); 

您可以如用_.bind,它有一定的影響。例如:

var add5 = _.bind(add, null /*context is irrelevant*/, 5); 
add5(3); // returns 8 

但是,您的函數沒有返回任何內容,並且您更改的上下文無法訪問。但是:

var ctx1 = {sum: 0}; 
function add(a) { this.sum += a; } // returns nothing! 
var addto1 = _.bind(add, ctx1); 
addto1(5); // undefined 
ctx1; // {sum: 5} 

var add5to1 = _.bind(add, ctx1, 5); 
add5to1(); // undefined 
ctx1; // {sum: 10} 

var ctx2 = {sum: 5}; 
add3to2 = _.bind(add, ctx2, 3); 
add3to2(); // undefined 
ctx2; // {sum: 8} 
+0

謝謝,嗯...實際上,我試圖理解綁定到一個函數上下文。任何想法,爲什麼一些討論中提到'約束'是'currying'?有數字對象的例子適用於_.bind()嗎? – poseid 2013-05-13 11:59:32

+0

好的,這就是我正在尋找的解釋!謝謝! – poseid 2013-05-13 12:02:27

+2

是的,很多人都錯了。這個維基百科條目解釋得相當好:http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application – Bergi 2013-05-13 12:03:43