柯里化(currying)是什么?
- 当一个函数有多个参数的时候先传递一部分参数调用它(这部分参数以后永远不会变);
- 然后返回一个新的函数接收剩余的参数,返回结果
// 柯里化演示
function checkAge (age) {
let min = 18
return age >= min
}
// 普通的纯函数
function checkAge (min, age) {
return age >= min
}
// 函数的柯里化
function checkAge (min) {
return function (age) {
return age >= min
}
}
// ES6
let checkAge = min => (age => age >= min)
let checkAge18 = checkAge(18)
let checkAge20 = checkAge(20)
console.log(checkAge18(20))
console.log(checkAge18(24))
// 模拟实现 lodash 中的 curry 方法
function getSum (a, b, c) {
return a + b + c
}
const curried = curry(getSum)
console.log(curried(1, 2, 3))
console.log(curried(1)(2, 3))
console.log(curried(1, 2)(3))
function curry (func) {
return function curriedFn(...args) {
// 判断实参和形参的个数
if (args.length < func.length) {
return function () {
return curriedFn(...args.concat(Array.from(arguments)))
}
}
return func(...args)
}
}