bind与curry的Javascript用法?

bind与curry的Javascript用法?,javascript,currying,Javascript,Currying,我试图理解curry与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

我试图理解
curry
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*/   }
/*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
的实现是:

/*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*/   }
/*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
不是一个内部函数(不同于IE9+中的
bind
)。但仍然:

为什么我听到人们一直在谈论
curry
,而他们可以简单地使用
bind
操作

唯一的区别是上下文,它实际上只能在
bind
函数中找到

例如:

假设我有这个函数:

function add(x,y,z)
{
  return x+y+z;
}
我可以用咖喱来做:

alert(add.curry(2).curry(1)(4)) //7
但我也可以用:

alert(add.bind(undefined,2).bind(undefined,1)(4)) //7
我不明白为什么这个
curry
term函数存在,而可以向bind函数添加虚拟上下文


我错过了什么

我认为这与旧浏览器的兼容性有关,因为bind只在ECMAScript 5之后才可用

有关
.bind()
支持的列表,请参见此:


据我所知,大多数人仍然使用咖喱,因为咖喱看起来更干净,因为它不需要额外的
未定义的

目的不同

是为了减少参数的数量,通常是为了避免使用相同的初始参数多次调用函数。例如:

var celsiusToKelvin = add.curry(273.15);

是确保将函数附加到对象。它还提供了一个curry功能,因此您可以使用bind()来curry(),但是如果您想使用curry,curry()的参数会更少,并且可以显示您的意图。

bind
强制您在使用
curry
时将上下文附加到函数上,您可以延迟函数上下文的指定,直到调用当前函数,这在许多情况下都很有用。
考虑下面的例子(不是完美的例子,只是为了说明这个想法):


据我所知,在Chrome版本33.0.1750.117 m上,
curry
不存在。谷歌搜索
Javascript-curry
对于提供它作为扩展的浏览器没有结果。这个函数来自哪里?你在使用外部库吗?@user2357112我没说它应该在Browser中那么你在哪里运行这个?您没有提到node.js或任何其他特定环境。(node.js似乎也没有
curry
方法。)我不理解你的问题<代码>绑定
用于将函数绑定到上下文,而
curry
用于创建部分应用的函数。它们有不同的用法,一个简单的事实是,你可以使用
bind
undefined
来进行curry,但这并不意味着你应该这样做,因为你正在混淆你的代码。如果你更普遍地想知道术语的起源,以及为什么JS的方法被称为
.bind()
,而不是
curry()
,那么,我猜这是因为
.bind()
确实给了您绑定
这个
值的选项,这实际上与咖喱无关。我相信这是
.bind()
的主要目的,因为
这个
值是动态变化的,在回调函数中处理起来很麻烦。我认为
.bind()
的想法可能来自
prototypejs
库,但我并不完全确定。我同意这是出于意图。换句话说,
bind
关闭函数,而
curry
保持打开状态。当然,正如OP所观察到的,操作实际上是相同的,您可以通过绑定函数的所有参数来使用
curry
关闭函数。但是一般的假设是curry函数不会被自己调用,而绑定函数会被调用。curry的实现还可以包括语法sugar(no curriedFunc(3,4)(2),just curriedFunc(3,4,2)),以及将函数关闭到一组参数的选项(最初定义的内容或在curry定义时设置的任意数字)。