參考文章 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 })
獲得的執行結果
git
這裏的 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; }