柯里化

參考文章 Understanding Currying in JavaScript
譯文 理解JavaScript的柯里化javascript

首先柯里化是個什麼?

黑人問號
百度的解釋:
在計算機科學中,柯里化(Currying)是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數且返回結果的新函數的技術。java

// 如今有一個接受兩個參數的函數 函數接受3個參數,並返回 和
  function fn1(param1, param2, param3) {
    console.log(param1 + param2 + param3)
  }
  fn1('a', 'b', 'c') // abc

  // currying
  function curryingfn1(param1) {
    return function (param2) {
      return function (param3) {
        return (param1 + param2 + param3)
      }
    }
  }
  curryingfn1('a')('b')('c') // abc

  // 爲了方便理解 能夠依次執行
  const _cfn1 = curryingfn1('a')
  const _cfn2 = _cfn1('b')
  const _cfn3 = _cfn2('c')
  console.info({ _cfn1, _cfn2, _cfn3 })

獲得的執行結果
image.pnggit

這裏的 fn1('a', 'b', 'c')=> fn2('a')('b')('c') 的過程就是 柯里化github

附:使用箭頭函數面試

fn3 = (param1) => (param2) => (param3) => console.log('fn3', param1 + param2 + param3)
  fn3('a')('b')('c') // fn3 abc

以上,fn1 做爲一個獨立的函數已經被轉換爲一系列函數。數組

柯里化 能幹什麼呢?

// 參數複用
  const regTest = (reg) => (text) => reg.test(text)
  const checkNum = regTest(/\d+/g)
  console.info(checkNum('aaa'), checkNum('123aaa')) //false true

附:最近看到的一個面試題

// 實現方法
// fn(1) //1
// fn(1)(2) //5
// fn(1)(2)(3) //14

function curryingCount() {
    // 第一次執行時,定義一個數組專門用來存儲全部的參數
    var _args = Array.prototype.slice.call(arguments);
    // 在內部聲明一個函數,利用閉包的特性保存_args並收集全部的參數值
    var _adder = function () {
      _args.push(...arguments);
      return _adder;
    };

    // 利用toString隱式轉換的特性,當最後執行時隱式轉換,並計算最終的值返回
    _adder.toString = function () {
      return _args.reduce(function (a, b = 0) {
        return a + b * b;
      });
    }
    _adder.value = _adder
    return _adder;
}
// 或者使用箭頭函數 !!注意~~~~,箭頭函數沒有this 和 arguments
curryingCount2 = (...arguments) => {
  // 第一次執行時,定義一個數組專門用來存儲全部的參數
  const _args = Array.prototype.slice.call(arguments);
  // 在內部聲明一個函數,arguments 做爲參數傳遞值
  const _adder = (...arguments) => {
    _args.push(...arguments);
    return _adder;
  };

  // 利用toString隱式轉換的特性,當最後執行時隱式轉換,並計算最終的值返回
  _adder.toString = () => _args.reduce((a, b = 0) => a + b * b);
  return _adder;
}
相關文章
相關標籤/搜索