定义
把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
上面的话怎么理解:
把接受多个参数的函数变换成接受一个单一参数
>> 比如一个函数里要传进来三个参数,但是我把它设置为只能传进来一个参数。
返回接受余下的参数而且返回结果的新函数
>>只能传进来一个参数,那其他两个参数怎么办?没事。最外层的函数可以再return
一个函数,这个函数在传入一个参数,那剩下的一个参数怎么办?中间的这个函数再return
一个函数,最后的函数再传入最后一个参数。
例子
一个求三个数之和的函数:
//正常写法
function add(x, y, z) {
return x + y + z;
}
console.log(add(1, 2, 3)); // 6
//ES5
var add = function(x) {
return function(y) {
return function(z) {
return x + y + z;
}
}
}
var addOne = add(1);
var addOneAndTwo = addOne(2);
var addOneAndTwoAndThree = addOneAndTwo(3);
console.log(addOneAndTwoAndThree);
//ES6
const add = x => y => z => x + y + z;
面试题
如何实现 multi(2)(3)(4)=24?
//简单的方法
function multi(a) {
return function(b) {
return function(c) {
return a * b * c;
}
}
}
//ES6的写法
const multi = x => y => z => x * y * z
// 柯里化最终优化版
function multi() {
var args = Array.prototype.slice.call(arguments);
var fn = function() {
var newArgs = args.concat(Array.prototype.slice.call(arguments));
return multi.apply(this, newArgs);
}
fn.toString = function() {
return args.reduce(function(a, b) {
return a * b;
})
}
return fn;
}
curry 函数的第一个参数是要动态创建柯里化的函数,余下的参数存储在 args 变量中。
执行 curry 函数返回的函数接收新的参数与 args 变量存储的参数合并,并把合并的参数传入给柯里化了的函数。
作用
- 减少代码冗余,以及增加代码的可读性
- 参数复用
- 延迟执行
柯里化的另一个应用场景是延迟执行。不断的柯里化,累积传入的参数,最后执行。 - 提前返回
网友评论