今日相对清闲,对函数柯里化做了一个了解;觉得柯里化更多的是提供了一种思路,就像做数学题一样;
比如说给一个题目,要求multi(2,3,4)、multi(2,3)(4)、multi(2)(3)(4)都输出24;
此刻我们都可以想到把这三个参数相乘就是24了,那如何才能拿到三个参数后再去执行相乘呢;
既然是相乘,肯定是有一个方法是返回 a * b * c;
// multi(2)(3)(4)=24?
// 从题目中可以看出,要实现的是一个柯里化函数;
// 什么是柯里化?传入的参数如果小于执行函数的形参数量,返回函数,并把刚才传递的第一个参数携带过去,如此循环,直到传入的参数长度等于执行函数的形参长度
function curry (fn, args) {
let len = fn.length; // 函数形参的长度
let _args = args || [];
return function () {
let newArgs = _args.concat(Array.prototype.slice.call(arguments));//下面调用时传入的参数就是arguments
// 如果参数长度小于形参,继续柯里化
if (newArgs.length < len) {
return curry.call(this, fn, newArgs) // 这里的newArgs传入后就是形参中的args
} else {
// 如果传入的参数和函数形参的长度一样,执行函数
return fn.apply(this, newArgs)
}
}
}
let multi = curry(function(a,b,c){
return a * b * c
})
multi(2, 3, 4) // 24
multi(2)(3)(4) // 24
multi(2, 3)(4) // 24