传参之前先调用一次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);
});
};
}
})();