Я пытаюсь понять разницу между curry
vs bind
.
Реализация bind
:
/*1*/ Function.prototype.bind = function ()
/*2*/ {
/*3*/ var fn = this,
/*4*/ args = Array.prototype.slice.call(arguments);
/*5*/ var object = args.shift();
/*6*/ return function ()
/*7*/ {
/*8*/ return fn.apply(object,
/*9*/ args.concat(Array.prototype.slice.call(arguments)))
/*10*/ };
/*11*/ }
Реализация curry
:
/*1*/ Function.prototype.curry = function ()
/*2*/ {
/*3*/ var fn = this,
/*4*/ args = Array.prototype.slice.call(arguments);
/*5*/ return function ()
/*6*/ {
/*7*/ return fn.apply(this,
/*8*/ args.concat(Array.prototype.slice.call(arguments)));
/*9*/ };
/*10*/ };
Я уже знаю, что curry
не является внутренней функцией (в отличие от bind
, которая находится в IE9 +). Но все же:
Почему я слышу, как люди говорят о curry
, хотя они могут просто использовать операцию bind
?
Единственное различие - это контекст, который фактически найден только в функции bind
.
Пример:
Скажем, у меня есть эта функция:
function add(x,y,z)
{
return x+y+z;
}
Я мог бы сделать это с помощью curry
:
alert(add.curry(2).curry(1)(4)) //7
Но я мог бы также сделать это с помощью
alert(add.bind(undefined,2).bind(undefined,1)(4)) //7
Я не понимаю, почему эта функция термина curry
существует, когда можно добавить фиктивный контекст к функции bind.
Что мне не хватает?