柯里化:函数接受一些参数,但不立即求值;返回一个匿名函数将参数保存下来;需要求值时将保存的全部参数一起用掉。(保存时穿参/求值时不传参)。
举个栗子:Js中用bind()函数实现
function foo(a, b, c) {
console.log("a:" + a + ",b:" + b + ",c" + c)
}
var ∅ = Object.create() //创建空对象,不带property
foo.apply(∅, [1, 2, 3]) // a:1 b:2 c:3
var bar = foo.bind(∅, 2)
bar(3,4) // a:2 b:3 c:4
解释: 固定第一个参数a:2 剩下的b,c通过传参赋值
或者:
function foo(...args) {
console.log("a:" + args[0] + ",b:" + args[1]+ ",c" + args[2])
}
var ∅ = Object.create() //创建空对象,不带property
var bar = foo.bind(∅, 2)
bar(3,4) // a:2 b:3 c:4
举个栗子:求一个月中每一天的花销总和(每天的花销不重要,只求最后的。)
var cost = (function() {
var money = 0;
return function() {
for(var i=0; i<arguments.length; i++) {
money += arguments[i]
}
return money
}
})();
var currying = function(fn) {
var args = [];
return function() {
if(arguments.length === 0) {
return fn.apply(this, args);
} else {
[].push.apply(args, arguments);
return arguments.callee;
}
}
};
var cost = currying( cost ) //柯里化
cost(100);
cost(200);
cost(300); // 不求值
console.log( cost() ); // 求值 600