Javascript 코리화 실현 원리 및 작용 해석

4574 단어 Javascript콜리
함수식 프로그래밍은 현재 비교적 유행하는 프로그래밍 모델로 함수를 매개 변수로 전달하고 부작용이 없는 함수로 되돌아오는 것을 주장한다. 말하자면 함수가 한 가지 일만 하기를 바라는 것이다.
JavaScript, Haskell, Clojure 같은 프로그래밍 언어는 함수식 프로그래밍을 지원합니다.
이런 프로그래밍 사상은 세 가지 중요한 개념을 포함한다.
  • 순수함수
  • 콜리화
  • 고급 함수
  • 이 글은 주로 사람들에게 콜리화라는 개념을 분명히 말하고 싶어 한다.
    코리화가 뭐예요?
    먼저 예를 살펴보겠습니다.
    function sum(a, b, c) {
    return a + b + c;
    }
    //호출
    sum(1, 2, 3);//육
    상술한 함수는 a, b, c 세 개의 매개 변수를 더하여 콜리화 함수로 다음과 같이 개작한다.
    function sum(a) {
    return function (b) {
    return function(c) {
    return a + b + c;
    }
    }
    }
    //호출
    let sum1 = sum(1);
    let sum2 = sum1(2);
    sum2(3);//육
    콜리화란 비교적 많은 파라미터를 가진 함수를 비교적 적은 파라미터를 가진 함수로 바꾸는 과정이다.
    우리는 한 걸음 한 걸음 위의 그 코리화 함수가 무엇을 했는지 보았다. 우선 첫 번째 단계는sum(1)을 호출했다. 이때 변수sum1은 다음과 같다.
    sum1 = function(b) {
    return function(c) {
    //이 때 변수 a가 패키지에 존재하므로 호출할 수 있습니다. a=1
    return a + b + c;
    }
    }
    그리고 sum1(2)을 호출합니다. 이때 변수sum2에 값을 부여하는 것은 다음과 같습니다.
    sum2 = function(c) {
    //변수 a, b는 모두 패키지 중입니다. a=1, b=2
    return a + b + c;
    }
    마지막으로sum2(3)를 호출하여 1+2+3의 결과 6을 되돌려줍니다.
    이것이 바로 가장 간단한 코리화 함수인데, 매우 간단하지 않습니까?
    코리화 함수의 작용
    그러면 문제가 생겼다. 위에서 개작한 후의 콜리화 함수와 원함수는 코드보다 훨씬 많고 원함수보다 이해하기 쉽다. 콜리화 함수는 도대체 무슨 소용이 있겠는가?
    확실히 크리화 함수는 여기서 보기에는 확실히 비대하고 실용적이지 않지만 많은 장면에서 그의 역할은 매우 크다. 심지어 많은 사람들이 무심코 크리화 함수를 사용하고 있다.간단한 예를 들다.
    만약 우리가 한 무더기의 장방체를 가지고 있다면, 우리는 이 장방체의 부피를 계산하여 다음과 같은 함수를 실현해야 한다.
    
    function volume(length, width, height) {
      return length * width * height;
    }
    volume(200, 100, 200);
    volume(200, 150, 100);
    volume(200, 50, 80);
    volume(100, 50, 60);
    위에서 장방체의 부피 함수를 계산하면 같은 길이의 장방체가 많이 존재하는 것을 발견할 수 있다. 우리는 다시 코리화 함수로 실현해 보자.
    
    function volume(length, width, height) {
      return function(width) {
        return function(height) {
         return length * width * height;
          }
      }
    }
    let len200 = volume(200);
    len200(100)(200);
    len200(150)(100);
    len200(50)(80);
    volume(100)(50)(60);
    위에서 len200 함수를 실현함으로써 우리는 길이가 200인 장방체의 부피를 통일적으로 처리하여 매개 변수의 복용을 실현하였다.
    우리는 함수를 한 번만 실행하는 예를 하나 더 들자.
    
    function execOnce(fun) {
       let flag = true;
     return function() {
      if (flag) {
       fun && fun();
       flag = false;
      }
     }
    }
    let onceConsole = execOnce(function() {
      console.log(' ');
    });
    onceConsole();
    onceConsole();
    예를 들어 우리는 execOnce 함수를 실현했다. 이 함수는 함수 파라미터를 받아들인 다음에 함수를 되돌려준다. 변수 flag는 패키지에 존재하고 되돌아오는 함수가 실행되었는지 판단하는 데 사용된다. onceConsole은 다음과 같다.
    
    let onceConsole = function() {
     if (flag) {
         (function() {
        console.log(' ');
       })()
       flag = false;
      }
    }
    이것도 크리화 함수의 간단한 응용이다.
    통용 코리화 함수의 실현
    기왕 콜리화 함수가 이렇게 실용적이라면, 우리는 통용되는 콜리화 함수를 실현할 수 있을까?통용된다는 것은 이 함수가 함수 파라미터를 코리화 함수로 변환할 수 있다는 것이다. 다음 버전에서 실현된 코드를 보자.
    
     //  
    var curry = function (fn) {
     var args = [].slice.call(arguments, 1);
     return function() {
      var newArgs = args.concat([].slice.call(arguments));
      return fn.apply(null, newArgs);
     };
    };
     function add(a, b) {
      return a + b;
     }
    
    var addFun = curry(add, 1, 2);
    addFun() // 3
    // 
    var addOne = curry(add, 1);
    위 코드와 같이, 우리는 함수를 매개 변수로 받아들인 다음, 다른 매개 변수를 수집하여, 이 매개 변수를 이 함수 매개 변수에 전달하여 실행한다.그러나 위의 코드에 문제가 있습니다. 매개 변수가 자유롭지 않습니다. 예를 들어 우리가 이렇게 호출하려고 하면 오류가 발생합니다.
    var addFun = curry(function(a, b,c) {
    return a + b + c;
    }, 1);
    addFun(2)(3);//addFun 오류 보고(...)is not a function
    이것은 우리의 매개 변수 복용 원칙에 위배되는 것 같다. 개선은 다음과 같다.
    
    function curry(fn, args) {
     var length = fn.length;
     args = args || [];
     return function(...rest) {
      var _args = [...args, ...rest];
      return _args.length < length
       ? curry.call(this, fn, _args)
      : fn.apply(this, _args);
     }
    }
    var fn = curry(function(a, b, c) {
     console.log(a + b + c);
    });
    fn('a', 'b', 'c'); // abc
    fn('a', 'b')('c'); // abc
    fn('a')('b')('c'); // abc
    위와 같이 실현하면 매우 완벽하다. 이 도구 함수의 실현은 총괄적으로 말하면 다음과 같다.
    패키지를 이용하여 함수의 매개 변수를 저장하고 매개 변수가 일정한 수량에 도달하면 함수를 실행합니다.
    후기
    크리화는 클립을 바탕으로 하는 것이기 때문에 클립을 이해하지 못하면 크리화에 대한 이해에 지장을 줄 수 있습니다. 이 글을 통해 여러분에게 자바스크립트의 크리화를 이해하고 이해할 수 있기를 바랍니다.
    이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

    좋은 웹페이지 즐겨찾기