zoukankan      html  css  js  c++  java
  • 函数柯里化

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

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

    高阶函数: 一个函数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
  • 相关阅读:
    [HEOI2014]南园满地堆轻絮
    [HEOI2016/TJOI2016]树
    初赛知识点
    [10.4模拟赛]T2
    [ZJOI2012]灾难
    [SDOI2010]古代猪文
    [9.26模拟赛]T1
    [9.26模拟赛]T3
    [9.26模拟赛]T2
    [9.19模拟赛]最小粒子数
  • 原文地址:https://www.cnblogs.com/sunmarvell/p/14534050.html
Copyright © 2011-2022 走看看