柯里化一个求和函数
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); }); }; }})();