• 高阶JS---函数柯里化


    什么是函数柯里化?

    百度百科:

    在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
    通俗点说就是将一个函数拆分成多个函数,是固定部分参数,返回一个接受剩余参数的函数,也称为部分计算函数,目的是为了缩小适用范围,创建一个针对性更强的函数。

    案例1:

    /*
     * 经典面试题
     * 函数参数不定回调函数数目不定
     * 编写函数实现:
     * add(1,2,3,4,5)==15
     * add(1,2)(3,4)(5)==15
     */
    function add() {
        // 第一次执行时,定义一个数组专门用来存储所有的参数
        var _args = [].slice.call(arguments);
        // 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
        var adder = function () {
            var _adder = function() {
                [].push.apply(_args, [].slice.call(arguments));
                return _adder;
            };
    
            // 利用隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
            _adder.toString = function () {
                return _args.reduce(function (a, b) {
                    return a + b;
                });
            }
    
            return _adder;
        }
        return adder.apply(null, _args);
    }
    // 输出结果,可自由组合的参数
    console.log(add(1, 2, 3, 4, 5));  // 15
    console.log(add(1, 2, 3, 4)(5));  // 15
    console.log(add(1)(2)(3)(4)(5));  // 15

    柯里化:

    这里做个记录

        <script type="text/javascript">
            function add(){
                var list = Array.prototype.slice.call(arguments);
                function sum(){
                    var innerList = function(){
                        Array.prototype.push.apply(list,Array.prototype.slice.call(arguments))
                        return innerList;
                    }

              // 每个对象的toString和valueOf方法都可以被改写,每个对象执行完毕,如果被用以操作JavaScript解析器就会自动调用对象的toString或者valueOf方法
              // 利用toString隐式调用的特性,当最后执行时隐式调用,并计算最终的值返回

                    innerList.toString = function(){
                        return list.reduce(function(a,b){
                            return a*b;
                        })
                    }
                    return innerList;
                }
                return sum.apply(null,list)
            }
            console.log(add(1,2)(2)(3))
        </script>

    
    
    
    
    
    
    

    .

  • 相关阅读:
    列表去重
    URL和URI的不同
    functional program language
    thinkphp5_笔记二
    关于《提问智慧》的笔记
    实习记录_2
    关于用户表的设计
    30秒运行超时的错误(Maximum execution time of 30 seconds exceeded)
    thinkphp5_笔记一
    Jquary 和Ajax实现简单的异步请求
  • 原文地址:https://www.cnblogs.com/fightjianxian/p/11995342.html
Copyright © 2020-2023  润新知