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

     一、柯里化

    柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

    例如这样:

    //柯里化前
    function add(a, b) {
        return a + b;
    } 
    add(10, 2) // 12
    
    //柯里化后
    var add = function(a) {
        return function(b) {
            return a + b;
        };
    };
    var addTen = add(10);
    addTen(2); // 12

    二、利用柯里化实现累加器

    function fn(){
        var numList = [].slice.call(arguments);
        var _fn = function(){
            var innerArguments = [].slice.call(arguments);
            numList = numList.concat(innerArguments);
            return _fn;
        }
        _fn.valueOf = function(){
            return numList.reduce(function(num1, num2){
                return num1 + num2;
            });
        }
        return _fn;
    }
    console.log(fn(1)(2)(3));

     这段代码初看可能不太好理解,这里我们将它拆分一下:

    arguments对象

    MDN,介绍的特别详细。

    每一个js函数内部都有arguments,它代表传入的参数数组。arguments 是一个类数组对象。可以用下面的语句将arguments转化成数组对象:

    var numList = [].slice.call(arguments); //将arguments转化成数组对象

    还有常用的:[].slice.call(arguments, 1) 返回的是arguments数组从1号位开始的片段。用来获取arguments里除了第一项以外的其他所有选项。

    valueOf() 方法   

    返回 Boolean 对象的原始值:

    <script type="text/javascript">
        var boo = new Boolean(false);
        document.write(boo.valueOf()); //false
    </script>

    这里也可以使用添加 toString() 的方式实现这一功能,与 valueOf() 做法一致。

    reduce()方法

    接收一个函数作为累加器。语法:

    array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

    使用范例:

    var numbers = [65, 44, 12, 4];
    function getSum(total, num) {
        return total + num;
    }
    function myFunction(item) {
        document.getElementById("demo").innerHTML = numbers.reduce(getSum);
    }

    递归

     可以看我的另一篇博客:递归

    思路总结

    首先若是想要实现 fn()() 这种调用方式的函数,则在 fn 函数体内一定也会返回一个函数。若是想要实现 fn()()()... 不定次数的调用,则意味着每一层的返回值均为一个函数,这就需要使用类似递归的方式去实现。在函数调用的最后一层,这个返回值应该是一个值而非函数,这里则需要使用 valueOf 这一方法。使用内置对象 arguments对函数中所传入的参数获取,arguments 不是数组,而是对象,将其转换为数组。使用数组的reduce 方法实现求和。

    学习并感谢:

    1、SegmentFault

    2、柯里化实现累加器

    3、柯里化与箭头函数

  • 相关阅读:
    kubernetes dashboard 二次开发
    grafana二次开发
    Harbor 定制页面 和 二次开发指南
    spring boot 知识点1
    spring boot2.1读取 apollo 配置中心3
    apollo 部门管理
    spring boot2.1读取 apollo 配置中心2
    a 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
    Net上机考试
    Net(ASP.NET)程序设计
  • 原文地址:https://www.cnblogs.com/PeriHe/p/8856843.html
Copyright © 2011-2022 走看看