当前位置:首页 > 北京头条 > 北京经验

柯里化一个求和函数

2019-07-01 22:38:46 来源:163健康
浏览量:

传参之前先调用一次var addFn = add();此时 _args成了内部累计私有变量 外部不可访问;此时可以继续传参调用addfFn(5,6)();最后一次调用不传参;

var add = function () {    var _args = [];//传参之前先调用一次var addFn = add();_args成了内部累计私有变量    return function () {        if (arguments.length === 0) {//造成结果:addfFn(5,6)();最后一次调用不传参;            return _args.reduce(function (a, b) {                return a + b;            });        }        Array.prototype.push.apply(_args,Array.prototype.slice.call(arguments));        console.log(_args)        return arguments.callee;    }};    var sum = add();//console.log(sum);     // Function//sum(100,200)(300);    // 调用形式灵活,一次调用可输入一个或者多个参数,并且支持链式调用sum(400,520);console.log(sum());   // 1000 (加总计算) 

上面 add是柯里化了的函数,它返回一个新的函数,新的函数接收可分批次接受新的参数,延迟到最后一次计算。

通用的柯里化函数

var curry = function(fn) {    var _args = []    return function cb() {        if (arguments.length == 0) {            return fn.apply(this, _args)        }        Array.prototype.push.apply(_args, arguments);        return cb;    }}//柯里化应用的简单例子var addEvent = (function(){    if (window.addEventListener) {        return function(el, sType, fn, capture) {            el.addEventListener(sType, function(e) {                fn.call(el, e);            }, (capture));        };    } else if (window.attachEvent) {        return function(el, sType, fn, capture) {            el.attachEvent("on" + sType, function(e) {                fn.call(el, e);            });        };    }})();