>웹 프론트엔드 >JS 튜토리얼 >function_javascript 팁을 반환하는 javascript 카레 함수

function_javascript 팁을 반환하는 javascript 카레 함수

WBOY
WBOY원래의
2016-05-16 18:42:001419검색

최초의 카레 함수는 약간 다형성이었습니다. 즉, 분기는 함수 매개변수에 따라 내부적으로 선택되었습니다.

코드 복사 코드는 다음과 같습니다. 다음과 같습니다:

//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 모두 선택 참고:
외부 J를 도입해야 하는 경우 실행하려면 새로 고쳐야 합니다.
그런 다음 클로저의 인기와 배열 변환 인수 기술의 발견으로 마침내 현대적인 커링 기능이 등장했습니다. 15~17세기 발견의 시대의 지리적 발견처럼 갑자기 JavaScript의 세계가 열렸습니다. 많이. 코드 복사


코드는 다음과 같습니다.
//간단한 모던 커링 기능function curry(fn, 범위) { var 범위 = 범위 || 창; var args = [] for (var i=2, len = 인수.길이; i < len; i) {
args.push(arguments[i]);
return function() {
fn.apply(scope, args)
};


일반 커링 함수에는 두 가지 기능만 있습니다. 실행 상황은 다음과 같습니다. 첫 번째 실행은 매개 변수가 부족하여 내부 함수로 돌아가고 두 번째 실행이 완료됩니다. 그러나 이 매개변수에 관해 몇 가지 기사를 계속 작성할 수 있습니다. 다음 함수를 보세요:




코드 복사

코드는 다음과 같습니다:

function sum( ){ var 결과=0; for(var i=0, n=arguments.length; iresult = 인수[i] 결과 반환 } alert(sum(1,2,3,4,5)) // 15

소위 매개변수 부족 문제는 없습니다. 매개변수를 전달하면 계산도 됩니다. 하지만 매개변수가 전달되지 않으면 어떻게 될까요? 맞습니다. 차이점은 매개변수가 있는지 여부입니다. 매개변수가 있으면 계속해서 실행되도록 할 수 있습니다. 마지막으로 매개변수 없이 한 번 실행됩니다. 즉, 이전 단계를 사용하여 매개변수를 저장합니다.
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 반복([])
}



[Ctrl A 모두 선택 참고: 외부 J를 도입해야 하는 경우 실행하려면 새로 고쳐야 합니다 ]
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.