实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3) = 6
add(1, 2, 3)(4) = 10
add(1)(2)(3)(4)(5) = 15
function add(){
var _args = [].slice.call(arguments);
var adder = function(){
var _add = function(){
[].push.apply(_args,[].slice.call(arguments));
return _add;
}
_add.toString = function(){
return _args.reduce(function(a,b){
return a+b;
})
}
return _add;
}
return adder.apply(null,_args)
}
柯里化(英语:Currying),又称为部分求值,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回一个新的函数的技术,新函数接受余下参数并返回运算结果。
接收单一参数,因为要携带不少信息,因此常常以回调函数的理由来解决。
将部分参数通过回调函数等方式传入函数中
返回一个新函数,用于处理所有的想要传入的参数
柯里化通用式
var currying = function(fn) {
var args = [].slice.call(arguments, 1);
return function() {
// 主要还是收集所有需要的参数到一个数组中,便于统一计算
var _args = args.concat([].slice.call(arguments));
return fn.apply(null, _args);
}
}
var sum = currying(function() {
var args = [].slice.call(arguments);
return args.reduce(function(a, b) {
return a + b;
})
}, 10)
console.log(sum(20, 10)); // 40
console.log(sum(10, 5)); // 25