image.png
封裝柯里化函數(shù)
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
其實(shí)curry 的封裝 非常牛逼
我們?cè)囍焉厦娴慕o合并在一起寫一下
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() {/這里是遞歸調(diào)用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))
}
}
}
這簡(jiǎn)直他娘的是一種藝術(shù)
柯里化到底干的是什么?
柯里化就是讓參數(shù)分離, 如果參數(shù)不夠,就繼續(xù)延遲執(zhí)行,
但傳入的參數(shù), 都必須和功能進(jìn)行綁定.
length 是用來(lái)判定 參數(shù)夠沒(méi)夠數(shù).
這里的關(guān)鍵是,
怎么讓一個(gè)功能先綁定一些參數(shù), 但又能流出接口可以繼續(xù)接收參數(shù)?
上面的柯里化能不能簡(jiǎn)化?
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))
}
}
}
這也能行. 不過(guò)比上面的沒(méi)那么精妙.