>웹 프론트엔드 >JS 튜토리얼 >javascript_javascript 스킬의 커링 기능 소개

javascript_javascript 스킬의 커링 기능 소개

WBOY
WBOY원래의
2016-05-16 17:56:151488검색

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

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

//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);
커리 반환;
}





[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]
return result;
}
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){//内部函数的参数为数组,由于立即执行,因此直接到第三重去
//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([]);
}


[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.