2013-05-13 23 views
5

Jestem trochę eksperymentować z _.bind(...). Widzę, jak wymusić kontekst funkcji za pomocą bind, ale nie widzę jeszcze sposobu na curry.Jak zrobić currying z UnderscoreJS?

Co próbuję to:

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

Jednak wywołanie add5() lub add5(5) nie wydaje się mieć pewne skutki.

Jakieś wskazówki dotyczące zawijania argumentów w taki sposób, że kontekst jest zachowywany z jednego połączenia do drugiego?

+1

Podkreślnik ma "_.część", który myślę, że można użyć do curry. –

+0

Ani 'add' ani' add5' * nie mają efektów *, więc czego oczekiwałeś? –

+0

Spodziewałem się uzyskać kilka liczb: 0, 5, 10, 15, ... – poseid

Odpowiedz

7

Prawdopodobnie chcesz wykonać częściową aplikację, a nie curry/schönfinkeling. Podkreślenia posiada funkcję _.partial dla tego:

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

Można także użyć _.bind, a ma pewne efekty. Na przykład:

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

Jednak Twoja funkcja niczego nie zwróciła, a kontekst, który zmieniłeś, nie był dostępny. Jednak:

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

Dzięki, hmm ... faktycznie, próbuję zrozumieć ten wiążący kontekst dla funkcji. Czy jest jakiś pomysł, dlaczego niektóre dyskusje wspominają o "wiązaniu" jako "curry"? Dowolny przykład z obiektami liczbowymi, które miałyby zastosowanie do _.bind()? – poseid

+0

OK, oto wyjaśnienie, którego szukałem! Dzięki! – poseid

+2

Tak, wielu robi to źle. Ten wpis w Wikipedii wyjaśnia go całkiem dobrze: http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application – Bergi