- 实现柯里化
柯里化是什么?是指一个函数,它接收函数A,能返回一个新的函数,新函数能够处理函数A的剩余参数
为什么要有柯里化?什么场景需要?
https://github.com/mqyqingfeng/Blog/issues/42
- 先看一个简单版本,这个版本仅return一次函数,所以他的参数传递最多两次必须要传完,想要使用 curry(add)(1)(2)会报错。
var curry = function (fn) {
var args = [].slice.call(arguments, 1);
return function () {
var newArgs = args.concat([].slice.call(arguments));
console.log(newArgs)
return fn.apply(this, newArgs);
};
};
function add(a, b) {
return a + b;
}
var addCurry = curry(add, 1, 2);
console.log(addCurry())
var addCurry1 = curry(add, 1);
console.log(addCurry1(2))
var addCurry2 = curry(add);
console.log(addCurry2(1, 2))
- 优化
function sub_curry(fn) {
var args = [].slice.call(arguments, 1);
return function () {
return fn.apply(this, args.concat([].slice.call(arguments)));
};
}
function curry(fn, length) {
length = length || fn.length;
var slice = Array.prototype.slice;
return function () {
if (arguments.length < length) {
var combined = [fn].concat(slice.call(arguments));
return curry(sub_curry.apply(this, combined), length - arguments.length);
} else {
console.log(fn)
return fn.apply(this, arguments);
}
};
}
var fn = curry(function add(a, b) {
return a + b;
})
const one = fn(1)(2)
console.log(one)