本文已参与「新人创作礼」活动,一起开启掘金创作之路。
维基百科柯里化解释:
柯里化是是把接收多个参数的函数,变成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数,而且返回结果的新函数的技术。
个人理解:
简单来说柯里化就是把一个有多个参数的函数,转化为一个可以接受部分参数的函数,并且这个函数最终会返回一个函数,这个返回的函数会处理剩余未传递的参数。
实现
接下来就是手写柯里化函数的过程,先看整体代码:
function hyCurring(fn) {
function curried(...args) {
//判断参数个数是否足够
if (args.length >= fn.length) {
//够就直接调用原函数
return fn.apply(this);
} else {
return function (...newArgs) {
return curried.apply(this, [...args, ...newArgs]);
}
}
}
return curried;
}
首先我们要将需要被柯里化的函数传递作为参数传递进去,最后返回一个柯里化后的函数curried。因为我们无法预知用户传递过来的参数个数,所以可以使用es6中的剩余参数...args来接收用户传递的参数。
function hyCurring(fn){
function curried(...args){
}
return curried;
}
然后我们需要判断一下用户传递的参数是否达到了规定传参的个数,如果达到了就在curried中直接调用fn就行并把执行结果返回。否则的话我们需要继续返回函数来处理用户第一次未传递进来的参数。并且调用的时候要确保this绑定不会发生变化所以用apply绑定当前环境下的this.
function hyCurring(fn) {
function curried(...args) {
//判断参数个数是否足够
if (args.length >= fn.length) {
//够就直接调用原函数
return fn.apply(this);
} else {
return function (...newArgs) {
return curried.apply(this, [...args, ...newArgs]);
}
}
}
return curried;
}