JavaScript中函数柯里化
概念
柯里化指的是将函数 f(a,b,d) 转变为 f(a)(b)(d)的形式
改变了其调用的形式 但是其本质的逻辑并未改变 内部还是原来函数的业务逻辑
将普通函数进行柯里化
// 柯里化 currying,利用递归的思想 写出函数的柯里化操作
function binCurrying(fn) {
function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args) // 参数已满时
} else {
return function (...args2) {
return curried.apply(this, [...args, ...args2]) // 参数未满时
}
}
}
return curried
}
// 定义一个普通函数
function add(a, b, c) {
return a + b + c
}
// 将add函数进行柯里化的操作
let res = binCurrying(add)
console.log(res(1)(2)(3)); // 6
res(2)(3) // 此时返回的是一个函数 因为参数没有传递完成 参数传递不足
应用场景
-
参数的复用
// 定义一个折扣函数 function discount(price, discount) { return price * discount } // 对这个函数进行柯里化操作 let curryDisCount = binCurrying(discount) let zheKou1 = curryDisCount(0.5) // 5折的折扣函数 let zheKou2 = curryDisCount(0.8) // 8折的折扣函数 console.log(zheKou1(400)); // 200 // 以上的操作相当于复用了折扣的这个参数,也可以多定义几个折扣函数,对应不同的折扣
-
延迟计算
-
动态生成函数
-
函数的柯里化在日常工作中合适的时机应该要使用到,很有利于后期项目的迭代,具体参照如下链接: https://www.jianshu.com/p/fc9c84e3f07a