美文网首页
函数柯里化

函数柯里化

作者: check_ping | 来源:发表于2017-05-06 20:35 被阅读0次
    定义

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

    意义

    下面是我个人的理解,不知是否正确,可能需要在往后的工作中不断去实践才知道柯里化的好处。

    function add(x,y){
      return x + y;
    }
    add(1,2);//3
    add(1,3);//4
    add(1,4);//5
    //我们每次都用到了1,但我们可能也会用到其他数字
    
    var add = function(x) {
      return function(y) {
        return x + y;
      };
    };
    
    var increment = add(1);
    
    increment(2);// 3
    
    increment(3);// 4
    
    

    其实就是相当于,在函数被多次调用,参数不能确定,但有可能出现相同参数的时候,第二种写法的适用性就更强了。

    柯里化函数代码及例子
    var currying = function(fn) {
        var args = [].slice.call(arguments, 1);
        return function() {
            var newArgs = args.concat([].slice.call(arguments));
            return fn.apply(null, newArgs);
        };
    };
    var add = function (num1, num2, num3){
       return num1 + num2 + num3;
    }
    var increment1 = currying(add, 1);
    // 假设很多地方调用add函数,其中都传入了一个参数 1,那么我们就可以先确定一个参数,然后再多次调用
    var result1 = increment1(2, 3);// 6
    var result2 = increment1(3, 4);// 8
    // 上面两次调用,3也重复了,那么我们又可以这样做
    var increment2 = currying(add, 1, 3);
    var result1 = increment2(2);// 6
    var result2 = increment2(4);// 8
    
    利用函数柯里化进行Dom操作

    比如页面有三个灰色的div,我点击下面按钮需要呈现的不同效果

    QQ图片20170506203513.png

    可以确定的是,无论点击哪一个按钮,第一个都要变红。
    利用currying函数

    var currying = function(fn) {
        var args = [].slice.call(arguments, 1);
        return function() {
            var newArgs = args.concat([].slice.call(arguments));
            return fn.apply(null, newArgs);
        };
    };
    var changeRed = function(){
        var blockArr = [].slice.call(arguments);
        for(var i=0;i<blockArr.length;i++){
            var blcok = document.getElementById(blockArr[i]);
            blcok.style.backgroundColor = "red";
        }
    }
    var toRed = currying(changeRed,"div1");
    

    接下来,我们只需要让按钮点击去执行toRed函数就行了

    <button onclick="toRed()">点击让第一个变红</button>
    <button onclick="toRed('div2')">点击让第一个和第二个变红</button>
    <button onclick="toRed('div3')">点击让第一个和第三个都变红</button>
    <button onclick="toRed('div2','div3')">点击让全部都变红</button>
    

    总结

    如果一个函数,其中一个或多个参数可能相同的情况下,我们不需要再次定义一个函数(这个函数的参数将相同的参数设为运算时固定的值),函数柯里化,从程序表达的角度出发,提高了函数的适用性。

    相关文章

      网友评论

          本文标题:函数柯里化

          本文链接:https://www.haomeiwen.com/subject/polytxtx.html