zoukankan      html  css  js  c++  java
  • 建议75:函数柯里化

    柯里化是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回一个新函数,这个新函数能够接受原函数的参数。下面可以通过例子来帮助理解。
    function adder(num) {
        return function(x) {
            return num + x;
        }
    }
    var add5 = adder(5);
    var add6 = adder(6);
    print(add5(1));  // 6
    print(add6(1));  //7

    函数adder接受一个参数,并返回一个函数,这个返回的函数可以像预期那样被调用。变量add5保存着adder(5)返回的函数,这个函数可以接受一个参数,并返回参数与5的和。柯里化在 DOM 的回调中非常有用。

    函数柯里化的主要功能是提供了强大的动态函数创建方法,通过调用另一个函数并为它传入要柯里化(currying)的函数和必要的参数而得到。通俗点说就是利用已有的函数,再创建一个动态的函数,该动态函数内部还是通过已有的函数来发生作用,只是传入更多的参数来简化函数的参数方面的调用。
    function curry(fn) {
        var args = [].slice.call(arguments, 1);
        return function() {
            return fn.apply(null, args.concat([].slice.call(arguments, 0)));
        }
    }
    function add(num1, num2) {
        return num1 + num2;
    }
    var newAdd = curry(add, 5);
    alert(newAdd(6));  //11

    在curry函数的内部,私有变量args相当于一个存储器,用来暂时存储在调用curry函数时所传递的参数值,这样再跟后面动态创建函数调用时的参数合并并执行,就会得到一样的效果。

    函数柯里化的基本方法和函数绑定是一样的:使用一个闭包返回一个函数。两者的区别在于,当函数被调用时,返回函数还需要设置一些传入的参数。
    function bind(fn, context) {
        var args = Array.prototype.slice.call(arguments, 2);
        return function() {
            var innerArgs = Array.prototype.slice.call(arguments);
            var finalArgs = args.concat(innerArgs);
            return fn.apply(context, finalArgs);
        };
    }

    创建柯里化函数的通用方式是:
    function curry(fn) {
        var args = Array.prototype.slice.call(arguments, 1);
        return function() {
            var innerArgs = Array.prototype.slice.call(arguments);
            var finalArgs = args.concat(innerArgs); retrun
            fn.apply(null, finalArgs);
        };
    }

    curry函数的主要功能就是将被返回的函数的参数进行排序。为了获取第一个参数后的所有参数,在arguments对象上调用slice()方法,并传入参数1,表示被返回的数组的第一个元素应该是第二个参数。

    本文:拷贝自http://book.2cto.com/201211/9320.html;

     编写高质量代码:改善JavaScript程序的188个建议

    progress every day !
  • 相关阅读:
    OK335xS 网络连接打印信息 hacking
    OK335xS mac address hacking
    buildroot linux filesystem 初探
    busybox filesystem matrix-gui-2.0 undefined function json_encode()
    RPi 2B Documentation
    RPi 2B Raspbian SD卡内部架构
    Error building results for action sayHello in namespace /inteceptor
    linux 失败无连接 检查电缆吗
    Struts2
    struts2加入自定义的actionValidatorManager实现类
  • 原文地址:https://www.cnblogs.com/hghrpg/p/4604808.html
Copyright © 2011-2022 走看看