函数柯里化

柯里化:一个函数原本有多个参数,只传入一个参数,生成一个新函数,由新函数接收剩下的参数;

偏函数:一个函数原本有多个函数,只传入一部分参数,生成一个新函数,由新函数接收剩下的参数

高阶函数: 一个函数A,参数是一个函数B,该函数A对这个参数B进行加工,得到一个函数,这个加工用的函数A就是高阶函数

为什么要柯里化?

提升性能:可以缓存一部分能力

将以下函数柯里化

function add(a, b, c) { return a + b + c; }

实现

        function curryFunc(func, args) {
            var funcLen = func.length;
            var args = args || [];
            return function() {
                var _args = [].slice.call(arguments);
                [].push.apply(_args, args);
                // 如果参数个数小于最初的func.length,则递归调用,继续收集参数
                if (_args.length < funcLen) {
                    return curryFunc.call(this, func, _args);
                }
                return func.apply(this, _args);
            }

        }

应用

        function add(a, b, c, d) {
            return a + b + c + d;
        }
        var curryAdd = curryFunc(add);
        let a = curryAdd(7, 1, 1);
        let b = curryAdd(7)(1)(1);
        console.log(a, b); //9, 9

参数个数应与func保持一致

        function add(a, b, c, d) {
            return a + b + c + d;
        }
        var curryAdd = curryFunc(add);
        let a = curryAdd(7, 1, 1, 1);
        let b = curryAdd(7)(1)(1)(1);
        console.log(a, b);

再应用

function check(targetString, reg) {
            return reg.test(targetString);
        }
        var _check = curryFunc(check);
        var checkPhone = _check(/^1[34578]d{9}$/);
        var isphone = checkPhone('183888888');  //false
原文地址:https://www.cnblogs.com/sunmarvell/p/14534050.html