avatar

目录
JavaScript之函数柯里化

概念

  1. 柯里化是指这样一个函数(假设叫做createCurry),他接收函数A作为参数,运行后能够返回一个新的函数。并且这个新的函数能够处理函数A的剩余参数。

简单场景下的柯里化

javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function add(a, b, c) {
return a + b + c;
}
add(1, 2, 3);

// 函数自身实现柯里化
function _add(a) {
return function(b) {
return function(c) {
return a + b + c;
}
}
}
_add(1)(2)(3);

通用函数柯里化的实现(createCurry):

  1. 思路

    • 柯里化函数的运行过程其实是一个参数的收集过程,我们将每一次传入的参数收集起来,并在最里层里面处理。
    • func有一个length属性,表示函数定义时所需参数个数;
    • 通过函数的length属性判断合适停止收集参数,返回计算结果;
  2. 实现:

    javascript
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    function createCurry(func, args) {
    var argsLength = func.length;
    var args = args || [];

    return function() {
    var _args = [].slice.apply(arguments);
    [].push.apply(_args, args);

    if (_args.length >= argsLength) {
    return func.apply(null, _args);
    }
    return createCurry(func, _args);
    }
    }

    function add(a, b, c) {
    return a + b + c;
    }
    const _add = createCurry(add);
    _add(1)(2)(3);

无限柯里化

  1. 问题:实现一个add方法,使计算结果能够满足如下预期
    javascript
    1
    2
    3
    add(1)(2)(3) = 6;
    add(1, 2, 3)(4) = 10;
    add(1)(2)(3)(4)(5) = 15;
  2. 思路:
    • 函数的隐式转换:当我们直接将函数参与其他的计算时,函数会默认调用valueOf/toString方法,直接将函数体转换为字符串参与计算;
    • 当我们同时重写函数的toString方法与valueOf方法时,最终的结果会取valueOf方法的返回结果;
  3. 实现:
    javascript
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function unlimitedAdd() {
    var args = [].slice.call(arguments);

    var adder = function() {
    var _adder = function() {
    args.push(...arguments);
    return _adder;
    }
    _adder.toString = function() {
    return args.reduce(function(a, b) {
    return a + b;
    })
    }

    return _adder;
    }

    return adder(...args);
    }

    console.log(unlimitedAdd(1)); // f 1
    console.log(unlimitedAdd(1)(2)); // f 3
    console.log(unlimitedAdd(1)(2)(3)); // f 6
文章作者: 盛顺炎
文章链接: https://www.shengshunyan.xyz/2018/11/12/JavaScript%E4%B9%8B%E5%87%BD%E6%95%B0%E6%9F%AF%E9%87%8C%E5%8C%96/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 果实的技术分享
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论