카레 오리지널과 수학자 Haskell Curry의 이름 (프로그래밍 언어 Haskell도 그 이름을 따서 명명되었습니다).
카레는 일반적으로 부분 평가라고도합니다. 그 의미는 매개 변수를 단계적으로 함수로 전달하는 것입니다. 각 파라미터가 전달되면 매개 변수를 부분적으로 적용하고 나머지 매개 변수를 수락하기 위해보다 구체적인 기능을 반환하십시오. 이러한 부분 매개 변수 함수의 여러 층은 최종 결과가 반환 될 때까지 중간에 중첩 될 수 있습니다.
따라서, 카레링 과정은 점차 매개 변수를 전달하여 기능의 적용 범위를 점차적으로 좁히고 점차 해결하는 과정입니다.
합 함수 카레
단계별 평가 후 간단한 예를 살펴 보겠습니다
var concat3words = function (a, b, c) {return a+b+c; }; var concat3wordScurrying = function (a) {return function (b) {return function (c) {return a+b+c; }; }; }; console.log (concat3words ( "foo", "bar", "baza")); // foo bar baza console.log (concat3wordscurrying ( "foo")); // [function] console.log (concat3wordScurrying ( "foo") ( "bar") ( "Baza"); // foo bar baza보시다시피, concat3wordScurrying ( "foo")은 함수이며, 각 통화는 새 함수를 반환하여 다른 호출을 수락 한 다음 결과가 결국 반환되고 배포가 해결 될 때까지 새 기능을 반환하고 레이어별로 레이어를 진행합니다. (PS : 폐쇄의 특성은 여기에서 활용됩니다)
그래서 이제 우리는 더 나아갑니다. 3 개 이상의 매개 변수를 통과 해야하는 경우 가능한 많은 매개 변수를 전달하고 매개 변수가 전달되지 않을 때 결과를 출력 할 수 있습니까?
먼저 정상적인 구현을하겠습니다.
var add = function (items) {return items.reduce (function (a, b) {return a+b}); }; Console.log (Add ([1,2,3,4]));그러나 각 숫자에 10을 곱하고 추가하도록 요청하면 다음을 추가하십시오.
var add = function (항목, multi) {return items.map (function (item) {return item*multi;}). ret (function (a, b) {return a + b}); }; console.log (add ([1, 2, 3, 4], 10);다행히도 맵과 감소 기능이 있습니다. 이 패턴을 따르는 경우 각 항목에 1을 추가하고 요약해야합니다. 맵의 함수를 교체해야합니다.
Curryization 구현을 살펴 보겠습니다.
var adder = function () {var _args = []; return function () {if (arguments.length === 0) {return _args.reduce (function (a, b) {return a + b;}); } [] .push.apply (_args, [] .slice.call (arguments)); return arguments.callee; }}; var sum = Adder (); Console.log (합); // 함수 합 (100,200) (300); // 호출 형식은 유연하며 한 번에 하나 이상의 매개 변수를 한 번에 입력 할 수 있으며 체인 호출을 지원합니다 (400). Console.log (sum ()); // 1000 (총 계산)위의 가산기는 카레 형식으로 새로운 기능을 반환하고 새로운 기능은 배치로 새로운 매개 변수를 수용하여 마지막 계산까지 지연 될 수 있습니다.
일반적인 카레 기능
보다 일반적인 카레는 마지막 계산을 함수로 캡슐화 한 다음이 기능을 매개 변수로 전달하여 명확하고 유연합니다.
예를 들어, 각 용어에 10을 곱하면 처리 기능을 매개 변수로 전달할 수 있습니다.
var Currying = function (fn) {var _args = []; return function () {if (arguments.length === 0) {return fn.apply (this, _args); } array.prototype.push.apply (_args, [] .slice.call (arguments)); return arguments.callee; }}; var multi = function () {var total = 0; for (var i = 0, c; c = 인수 [i ++];) {Total+= C; } 총계; }; var sum = 카레 링 (멀티); 합 (100,200) (300); 합 (400); Console.log (sum ()); // 1000 (빈 전화를받을 때만 계산됩니다)이러한 방식으로 Sum = Currying (Multi)에서 호출은 매우 명확하며 사용 효과도 훌륭합니다. 예를 들어, 여러 값을 축적하려면 여러 값을 매개 변수 합 (1,2,3) 또는 지원 체인 호출, 합 (1) (2) (3)로 사용할 수 있습니다.
카레의 기초
위의 코드는 실제로 고차 기능입니다. 고차 함수는 함수를 작동시키는 함수를 나타냅니다. 하나 이상의 함수를 매개 변수로 수신하고 새 함수를 반환합니다. 또한, 폐쇄의 특성은 또한 중간 공정에서 입력 된 매개 변수를 저장하기 위해 의존된다. 지금 바로:
함수는 매개 변수로 전달 될 수 있습니다
함수는 기능의 반환 값으로 사용할 수 있습니다
폐쇄
카릴 절의 역할
지연 계산. 위의 예는 상대적으로 낮습니다.
매개 변수 멀티플렉싱. 동일한 함수를 여러 번 호출하고 전달 된 매개 변수가 대부분 동일하면, 함수는 카레링을위한 좋은 후보가 될 수 있습니다.
동적으로 함수를 만듭니다. 이는 부분 계산 결과 후에 동적으로 생성 될 수 있으며,이를 바탕으로 후속 비즈니스를 처리하기 위해 새로운 기능이 동적으로 생성되어 반복 계산을 생략합니다. 또는 호출 함수로 전달할 매개 변수의 서브 세트의 일부를 적용하여 새 함수를 동적으로 생성 할 수 있으며, 이는 반복적으로 전달되는 매개 변수를 (미래에도 반드시 필요하지 않음) 저장합니다. 예를 들어, 이벤트 브라우저가 이벤트를 추가 할 수있는 보조 방법입니다.
var addevent = function (el, type, fn, capture) {if (wind } else if (wind }};이벤트를 추가 할 때마다 ... 다른 경우 .... 실제로 브라우저에서는 한 번만 결정을 내야합니다. 판단 후 결과에 따라 새로운 기능을 동적으로 생성 할 수 있으며 향후 재 계산할 필요가 없습니다.
var addevent = (function () {if (wind el.attachevent ( "on + stype, function (e) {} (});이 예는 IF ... Else ...에 대한 첫 번째 판단 후에 계산의 일부가 완료되고 나중에 전달 된 매개 변수를 처리하기 위해 새로운 기능이 동적으로 만들어집니다. 이것은 전형적인 카릴화입니다.
function.prototype.bind 메소드도 카레 응용 프로그램입니다
직접 실행하는 Call/Apply 메소드와 달리 BIND 메소드는 첫 번째 매개 변수를 기능 실행 컨텍스트로 설정하고 다른 매개 변수는 차례로 호출 메소드로 전달됩니다 (함수 자체의 본체는 실행되지 않으며, 이는 실행 지연으로 간주 될 수 있으며, 동적 기능을 생성하고 반환합니다.
var foo = {x : 888}; var bar = function () {console.log (this.x); } .bind (foo); // 바인드 바 (); // 888아래는 바인드 함수의 시뮬레이션입니다. TestBind는 새로운 기능을 생성하고 반환합니다. 새로운 기능에서 비즈니스를 실행하려는 기능은 실제 매개 변수에 전달 된 컨텍스트에 바인딩되며 실행이 지연됩니다.
function.prototype.testbind = function (scope) {var fn = this; //// 이것은 testbind 메소드를 호출하는 함수, return function () {return fn.apply (scope); }}; var testbindbar = bar.testbind (foo); // console.log (testbindbar)의 실행을 지연시키기 위해 foo를 바인딩합니다. // 함수 (bind 이후에 실행을 지연시키는 새 함수를 반환) testBindBar (); // 888여기서 우리는 프로토 타입에서 이것에 대한 이해에주의를 기울여야합니다.
위의 기사는 JavaScript 카레링에서 카레링하는 기능에 대한 심층적 인 분석은 내가 당신과 공유하는 모든 내용입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.