最近遇到一道题:用js实现一个sum使得sum(2,3),和sum(2)(3)都能得到同样的结果。 我在网上找了下实现的方法,叫做curry Function.
下面是实现的代码:
var sum = function(a) {
var arg = arguments;
if (arg[1]) {
return arg[0] + arg[1];
} else {
return function(b) {
return a + b;
};
}
};
sum(2,3);
sum(2)(3);
别人写的代码如下:
function add(a, b) {
if (arguments.length < 1) {
return add;
} else if (arguments.length < 2) {
return function(c) { return a + c }
} else {
return a + b;
}
}
什么是curry(柯里化)?
curry 的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。
栗子:
var curryIt = function(uncurried) {
var parameters = Array.prototype.slice.call(arguments, 1);
return function() {
return uncurried.apply(this, parameters.concat(
Array.prototype.slice.call(arguments, 0)
));
};
};
参考
https://www.sitepoint.com/currying-in-functional-javascript/ http://www.crockford.com/javascript/www_svendtofte_com/code/curried_javascript/index.html https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/ch4.html#总结