封装柯里化函数
function FixedParmasCurry (fn) {
var args = [].slice.call(arguments,1);
return function () {
var newArg = args.concat([].slice.call(arguments,0))
return fn.apply(this,newArg);
}
}
function curry (fn,length) {
var length = length || fn.length;
return function () {
if (arguments.length < length) {
var combine = [fn].concat([].slice.call(arguments));
return curry(FixedParmasCurry.apply(this,combine),length - arguments.length);
}else {
return fn.apply(this,[].slice.call(arguments))
}
}
}
image.png
image.png
其实curry 的封装 非常牛逼
我们试着把上面的给合并在一起写一下
function curry(fn, length) {
var length = length || fn.length;
return function() {
if(arguments.length < length) {
var combine = [fn].concat([].slice.call(arguments));
return curry(function() {/这里是递归调用curry
var args = [].slice.call(arguments, 1);
return function() {
var newArg = args.concat([].slice.call(arguments, 0))
return fn.apply(this, newArg);
}
}.apply(this,combine), length - arguments.length);
} else {
return fn.apply(this, [].slice.call(arguments))
}
}
}
这简直他娘的是一种艺术
柯里化到底干的是什么?
柯里化就是让参数分离, 如果参数不够,就继续延迟执行,
但传入的参数, 都必须和功能进行绑定.
length 是用来判定 参数够没够数.
这里的关键是,
怎么让一个功能先绑定一些参数, 但又能流出接口可以继续接收参数?
上面的柯里化能不能简化?
function curry(fn, length) {
var length = length || fn.length;
return function() {
if(arguments.length < length) {
var args = [].slice.call(arguments);
return curry(function() {
var newArg = args.concat([].slice.call(arguments, 0))
return fn.apply(this, newArg);
}, length - arguments.length);
} else {
return fn.apply(this, [].slice.call(arguments))
}
}
}
这也能行. 不过比上面的没那么精妙.
网友评论