函数是一等公民,离不开柯里化[1]的表示形式。
常规的一个add:
function add(a,b){
return a+b
}
柯里化后的add
function addCurry(a){
return function(b){
return a + b;
}
}
在调用上也是有很大区别。
add(1,2); // 3
addCurry(1)(2) // 3
乍一看,这个东西和脱裤子放屁没什么区别。怎么说呢,一步的操作分为了两步。
那我们换一个
function add(a) {
return function(b) {
if (b === undefined) {
var result = a;
return a=undefined,result;
} else {
return a+= b, arguments.callee
}
}
}
add(1)(2)(3)(4)() // 10
arguments.callee
这个属性返回当前正在执行的函数
为什么不用this呢?还记得js中的this指向的是函数拥有者,而不是函数本身吗,所以这里的this并不是该函数本身。
实际上在严格模式下,这个arguments.callee是不允许存在的。
上面的函数改写为
function add(a) {
return function curry(b) {
if (b === undefined) {
var result = a;
return a=undefined,result;
} else {
return a+= b, curry
}
}
}
add(1)(2)(3)(4)() // 10
仇归仇,恨归恨,不同的表现形式都是为了处理相同的事情,所以在核实的场景下选择合适的方法,而不是以不变应万变,编程就要随机应变不是吗。
来看一个柯里化组合的操作
function Color(color) {
return function() {
return color
}
}
function Size(size) {
return function() {
return size;
}
}
function link(fn, fn2) {
return function(arg) {
return arg + fn() + fn2();
}
}
var green = Color("green");
var yellow = Color("yellow ");
var large = Size('large');
var small = Size("small");
var smallyellow = link(small ,yellow );
var yellowsmall = link(yellow ,small );
smallyellow(" car ");
yellowsmall(" bike ");
-
将多个参数表示形式,变为单个参数表示形式。 ↩