- currying又称为部分求值。
- 一个currying函数接受了一些参数后,并不会立即求值,而是继续返回另外一个函数,并利用闭包将刚才传入的参数保存起来。
等到函数需要真正求值的时候,之前传入的参数会被一次性用于求值。
例子1:加入要编写一个函数,计算每个月的开销。每天需要将当天的花销也保存下来。
- 下面代码中,虽然是要计算月底花销,但实际每天都计算了一次,而实际上我们不关心每天开销了多少,只需要在月底做一次计算即可
1 | var monthCost = 0; |
- cost柯里化的简陋实现
1 | var cost = (function () { |
- 通用的currying函数,接受一个函数作为参数,并将该函数柯里化
1 | var currying = function (fn) { |
- 反柯里化uncurrying:
- 使用call和apply时,能够把任意对象当做this传入某个方法,这样,方法中用到的this就不再局限于原来规定的对象,
- 而是加以泛化而得到更广的适用性。
- 有没有办法把泛化this的过程提取出来? 这就是uncurrying要做的事情!
- 下面是uncurrying的一种实现:
1 | function.prototype.uncurrying = function () { |
下面就可以将Array.prototype.push.call
转换成一个泛化得函数1
2
3
4
5
6var push = Array.prototype.push.uncurrying();
var slice = Array.prototype.slice.uncurrying();
(function () {
push(arguments, 4);
console.log(slice(arguments));
})(1, 2, 3);
- 下面是uncurrying的另一种实现
1 | function.prototype.uncurrying2 = function () { |