函数柯里化的应用
2021-09-11 本文已影响0人
菜鸡前端
百度百科:在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。
通俗的说,柯里化是指一个函数,他接收函数作为参数,运行后能够返回一个新的函数。并且这个新的函数能够处理函数A的剩余参数,完整柯里化通常依赖 JS 的闭包。
function curry(fn) {
let arr = [];
return function curried(...args) {
arr = [...arr, ...args]
if (arr.length > fn.length) {
return fn(...arr);
}
return curried;
}
}
function sum(a, b, c) {
return a * b * c;
}
let sum2 = curry(sum)
let sum3 = curry(sum)
console.log(sum2(1)(2)(2, 3)) // 4
console.log(sum3(1)(2)(3, 2)) // 6
上面的例子中,被传入的函数 fn 的调用时机,依赖于它自身的参数个数,当闭包属性 arr 长度达到要求后,才会被调用。这样的需求我个人感觉不多,那么函数柯里化的好处是什么?下面是柯里化更常用的一种场景:
// 更自由的组合参数
function createRequest(option, request) {
return function (args) {
return request({...option, ...args })
}
}
function request(option) {
return option;
}
let longRequest = createRequest({
timeout: 24 * 3600 * 1000
}, request)
let longAndUserRequest = createRequest({
api: '/user'
}, longRequest)
var res = longAndUserRequest({ name : '111' })
// api: "/user"
// name: "111"
// timeout: 86400000
它可以自由组合参数,让代码更简洁,比如 Function.prototype.bind 以及 axios.create 都使用了 函数柯里化的特性,我认为函数柯里化是一种设计模式,有点类似组合模式。这种组合方式缺点是:导致调用栈增加。