我试图理解 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*/ }
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;
}
我可以用柯里化
来实现:
alert(add.curry(2).curry(1)(4)) //7
但我也可以用以下方式完成:
alert(add.bind(undefined,2).bind(undefined,1)(4)) //7
我不明白为什么会有curry
这个函数,既然可以给bind
函数添加一个虚拟上下文。
我错过了什么吗?
curry
函数不存在。搜索JavaScript curry
并没有在浏览器的扩展中找到结果。这个函数是从哪里来的?你是否使用了外部库? - user2357112curry
方法。) - user2357112bind
用于将函数绑定到上下文,而curry
用于创建部分应用的函数。它们有不同的用法,仅仅因为你可以使用bind
和undefined
进行柯里化并不意味着你应该这样做,因为这会使你的代码变得晦涩难懂。 - Paolo Moretti.bind()
函数?我真的不明白你在说什么。许多函数式编程概念在JS拥有.bind()
之前就已经存在了,事实上,在JS出现之前就已经存在了。难道它们现在应该停止存在吗? - cookie monster.bind()
而不是curry()
,我猜测这是因为.bind()
确实提供了绑定this
值的选项,这与柯里化并没有太大关系。我认为这是.bind()
的主要目的,因为this
值在回调函数中动态变化,并且处理起来可能很麻烦。我认为.bind()
的想法可能来自于prototypejs
库,但我不完全确定。 - cookie monster