최초의 카레 함수는 약간 다형성이었습니다. 즉, 분기는 함수 매개변수에 따라 내부적으로 선택되었습니다.
코드 복사 코드는 다음과 같습니다. 다음과 같습니다:
//http://www.openlaszlo.org/pipermail/laszlo-user/2005-March/000350.html
// ★★2005년 3월 8일, 00:06, Steve Albin은 다음과 같이 썼습니다.
function add(a, b) {
if (arguments.length < 1) {
return add;
} else if (arguments.length < 2) {
return function(c) { return a c }
} else {
return a b;
}
}
var myadd = add( 2 ); 🎜>var total = myadd(3);
일본의 선구자는 해당 인수를 알아내기 전에 매우 복잡한 정규식과 eval을 사용하여 eval과 더 유사한 방법을 생각해냈을 것입니다. Array의 기본 방법을 사용하여 배열로 변환할 수도 있습니다.
function curry(fun) {
if (typeof fun != 'function') {
throw new Error("인수는 함수여야 합니다.")
}
if (fun.arity == 0) {
throw new Error( "함수에는 두 개 이상의 인수가 있어야 합니다.");
var funText = fun.toString()
var args = /function .*((.*) )(.*)/.exec(funText)[1].split(', ');
var firstArg = args.shift()
var RestArgs = args.join(', '); 🎜>var body = funText.replace(/function .*(.*) /, "");
var curriedText =
"function (" firstArg ") {"
"return 함수 ("restArgs ")" body
"}";
eval("var curried =" curriedText);
커리 반환;
}
//간단한 모던 커링 기능
function curry(fn, 범위) {
var 범위 = 범위 || 창;
var args = []
for (var i=2, len = 인수.길이; i < len; i) {
args.push(arguments[i]);
return function() {
fn.apply(scope, args)
};
일반 커링 함수에는 두 가지 기능만 있습니다. 실행 상황은 다음과 같습니다. 첫 번째 실행은 매개 변수가 부족하여 내부 함수로 돌아가고 두 번째 실행이 완료됩니다. 그러나 이 매개변수에 관해 몇 가지 기사를 계속 작성할 수 있습니다. 다음 함수를 보세요:
코드 복사
for(var i=0, n=arguments.length; i
result = 인수[i]
return result;
}
alert(sum(1,2,3,4,5)) // 15
이렇게 하면 매개변수 부족 문제가 발생하지 않습니다. 매개변수를 전달하면 . 하지만 매개변수가 전달되지 않으면 어떻게 될까요? 맞습니다. 차이점은 매개변수가 있는지 여부입니다. 매개변수가 있으면 계속해서 실행되도록 할 수 있습니다. 마지막으로 매개변수 없이 한 번 실행됩니다. 즉, 이전 단계를 사용하여 매개변수를 저장합니다.
코드 복사
sum2() // 15
일반 커링 함수와 비교하면, 이건 좀 어렵네요 . 자세한 내용은 댓글을 참조하세요.
코드 복사
코드는 다음과 같습니다.
var curry= function(fn){//原函数的参数为函数
return function(args){//内部函数的参数为数组,由于立即执行,因此直接到第三重去
//args是相对于第三重内部函数可是全局变量
var self= arguments.callee;//把自身保存起来(就是那个数组为参数的第二重函数)
return function(){ //这才是第二次调用的函数
if(arguments.length){//如果还有要添加的参数
[].push.apply(args,arguments);//apply把当前传入的所有参数放进args中
return self(args);
}else{
return fn.apply(this,args);//apply的第二参数为数组
}
}
}([]);
};
function sum(){
var result=0;
for(var i=0, n=arguments.length; iresult += arguments[i];
}
return result;
};
var curry = function(fn){//原函数的参数为函数
return function(args){//内部函数的参数为数组,由于立即执行,因此直接到第三重去
var self= arguments.callee;//把自身保存起来
return function(){ //这才是第二次调用的函数
if(arguments.length){//如果还有要添加的参数
[].push.apply(args,arguments);
return self(args);
}
else return fn.apply(this,args);//执行
}
}([]);
};
var sum2= curry(sum);
sum2= sum2(1)(2)(3)(4)(5);
alert(sum2());
或者每次传入多个参数:
function sum(){
var result=0;
for(var i=0, n=arguments.length; iresult += arguments[i];
}
return result;
};
var curry = function(fn){//原函数的参数为函数
return function(args){//内部函数的参数为数组,由于立即执行,因此直接到第三重去
var self= arguments.callee;//把自身保存起来
return function(){ //这才是第二次调用的函数
if(arguments.length){//如果还有要添加的参数
[].push.apply(args,arguments);
return self(args);
}
else return fn.apply(this,args);//执行
}
}([]);
};
var sum2= curry(sum);
sum2= sum2(1,2,3);
sum2= sum2(4,5,6);
sum2= sum2(7,8,9);
alert(sum2());
但上面的函数有不足之处,最后怎么也要放个括号,我们想只要参数足够就返回结果,多出的参数忽略。改进如下:
function curry(f) {
if (f.length == 0) return f;
function iterate(args) {
if (args.length <= f.length)
return f.apply(null, args);
return function () {
return iterate(args.concat(Array.prototype.slice.call(arguments)));
};
}
return iterate([]);
}