美文网首页
函数柯里化的应用

函数柯里化的应用

作者: 菜鸡前端 | 来源:发表于2021-09-11 12:32 被阅读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 都使用了 函数柯里化的特性,我认为函数柯里化是一种设计模式,有点类似组合模式。这种组合方式缺点是:导致调用栈增加。

    相关文章

      网友评论

          本文标题:函数柯里化的应用

          本文链接:https://www.haomeiwen.com/subject/utzowltx.html