2013-05-13 5 views
5

Sto provando un po 'con _.bind(...). Vedo come forzare un contesto di funzione con bind, ma non vedo ancora come fare il currying.Come fare curring con UnderscoreJS?

Quello che cerco è questo:

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

Tuttavia, chiamando add5() o add5(5) sembra non avere alcuni effetti.

Eventuali indizi su come eseguire il wrap degli argomenti in modo che il contesto venga preservato da una chiamata a un'altra?

+1

Underscore ha un '_.partial', che penso si possa usare per curry. –

+0

Né 'add' né' add5' * hanno * effetti, quindi cosa ti aspettavi che accadesse? –

+0

Mi aspettavo di ottenere alcuni numeri: 0, 5, 10, 15, ... – poseid

risposta

7

Probabilmente si vuole fare applicazione parziale, non currying/schönfinkeling. Underscore ha la funzione _.partial per questo:

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

È possibile anche utilizzare _.bind, e ha alcuni effetti. Ad esempio:

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

Tuttavia, la funzione non ha restituito nulla e il contesto che è stato modificato non era accessibile. Tuttavia:

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

Grazie, hmm ... in realtà, sto cercando di capire quel contesto vincolante su una funzione. Qualche idea, perché alcune discussioni menzionano il 'binding' come 'currying'? Qualsiasi esempio con oggetti numerici applicabili a _.bind()? – poseid

+0

ok, questa è la spiegazione che stavo cercando! Grazie! – poseid

+2

Sì, molti si sbagliano. Questa voce di Wikipedia lo spiega abbastanza bene: http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application – Bergi