최초의 카레 함수는 약간 다형성이었습니다. 즉, 분기는 함수 매개변수에 따라 내부적으로 선택되었습니다.
코드 복사 코드는 다음과 같습니다. 다음과 같습니다:
//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); 🎜>
일본의 선구자는 Array의 기본 함수를 사용하여 인수를 배열로 변환할 수도 있다는 사실을 알아내기 전에 매우 복잡한 정규화 및 평가를 사용하여 현대 카레의 의미에 더 가까운 함수를 생각해냈을 것입니다. 방법.
코드 복사
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);
커리 반환
함수 카레(재미) {
if (재미 유형 != '함수') {
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 =
"함수(" firstArg ") {"
"반환 함수("restArgs ")" 본문
"}";
eval("var curried =" curriedText);
카레를 돌려준다;
}
함수 합(x, y) {
xy를 반환합니다.
}
함수 평균3(a, b, c) {
반환 (a b c)/3;
}
var a = 카레(합)(10)(15)
경고(a)//25
var b = 카레(평균3)(10)(20, 30);
경고(b)//20
var c = curry(curry(sum))(10)()(20);
경고(c);
var d = curry(curry(mean3)(10))(20)(30);
경고(d);
[Ctrl A 모두 선택 참고:
코드는 다음과 같습니다.
args.push(arguments[i]);
return function() {
fn.apply(scope, args)
};
일반 커링 함수에는 두 가지 기능만 있습니다. 실행 상황은 다음과 같습니다. 첫 번째 실행은 매개 변수가 부족하여 내부 함수로 돌아가고 두 번째 실행이 완료됩니다. 그러나 이 매개변수에 관해 몇 가지 기사를 계속 작성할 수 있습니다. 다음 함수를 보세요:
코드 복사
코드는 다음과 같습니다:
소위 매개변수 부족 문제는 없습니다. 매개변수를 전달하면 계산도 됩니다. 하지만 매개변수가 전달되지 않으면 어떻게 될까요? 맞습니다. 차이점은 매개변수가 있는지 여부입니다. 매개변수가 있으면 계속해서 실행되도록 할 수 있습니다. 마지막으로 매개변수 없이 한 번 실행됩니다. 즉, 이전 단계를 사용하여 매개변수를 저장합니다.
var sum2= curry(sum);
sum2= sum2(1)(2)(3)(4)(5);
sum2() // 15
일반과 비교 커링 기능은 좀 어렵네요. 자세한 내용은 댓글을 참조하세요.
var curry= function(fn){ //원래 함수의 매개변수는 함수
return function(args){//내부 함수의 매개변수는 바로 실행되므로 3단계로 바로 이동합니다
//args는 세 번째 수준 내부에 상대적입니다. 함수는 전역 변수일 수 있습니다.
var self=args.callee;//자체 저장(즉, 배열을 매개변수로 사용하는 두 번째 함수)
return function(){ //두 번째 호출입니다. Function
if(arguments.length){//추가할 매개변수가 더 있는 경우
[].push.apply(args,arguments);//apply 현재 전달된 모든 매개변수를 args에 넣습니다.
return self(args);
}else{
return fn.apply(this,args);//apply의 두 번째 매개변수는 배열입니다.
}
}
}([ ])
}
또는 매번 여러 매개변수를 전달합니다:
하지만 위 함수에는 단점이 있습니다. 매개변수가 충분하다면 결과를 반환하고 싶고, 추가 매개변수는 무시됩니다. 개선된 사항은 다음과 같습니다.
<.>
코드 복사 코드는 다음과 같습니다. (f) { if (f.length == 0) return f;
function iterate(args) {
if (args.length <= f.length)
return f.apply (null, args);
return 함수 () {
return iterate(args.concat(Array.prototype.slice.call(arguments)))
}
return 반복([])
}