2013-05-13 11 views
5

Tôi đang thử nghiệm một chút với _.bind(...). Tôi thấy làm thế nào để buộc một bối cảnh chức năng với ràng buộc, nhưng chưa thấy làm thế nào để làm currying.Làm thế nào để làm currying với UnderscoreJS?

Những gì tôi cố gắng là thế này:

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

Tuy nhiên, gọi add5(), hoặc add5(5) dường như không có một số hiệu ứng.

Bất kỳ manh mối nào về cách thực hiện quấn các đối số sao cho ngữ cảnh được giữ nguyên từ một cuộc gọi đến một cuộc gọi khác?

+1

Gạch dưới có '_.partial', mà tôi nghĩ bạn có thể sử dụng để cà ri. –

+0

Cả 'add' lẫn' add5' * đều không có hiệu ứng *, vì vậy bạn mong đợi điều gì sẽ xảy ra? –

+0

Tôi đã mong đợi để có được một số con số: 0, 5, 10, 15, ... – poseid

Trả lời

7

Có thể bạn muốn làm ứng dụng một phần, không phải currying/schönfinkeling. Gạch có _.partial chức năng cho việc này:

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

Bạn cũng có thể sử dụng _.bind, và nó một số hiệu ứng. Ví dụ:

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

Tuy nhiên, chức năng của bạn không trả lại bất kỳ điều gì và ngữ cảnh bạn thay đổi không thể truy cập. Tuy nhiên:

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

Cảm ơn, hmm ... thực sự, tôi đang cố gắng hiểu ngữ cảnh ràng buộc đó lên một hàm. Bất kỳ ý tưởng nào, tại sao một số cuộc thảo luận đề cập đến 'ràng buộc' là 'cà ri'? Bất kỳ ví dụ nào có đối tượng số sẽ áp dụng cho _.bind()? – poseid

+0

ok, đó là lời giải thích mà tôi đang tìm kiếm! Cảm ơn! – poseid

+2

Vâng, nhiều người hiểu sai. Mục Wikipedia này giải thích nó khá tốt: http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application – Bergi