>웹 프론트엔드 >JS 튜토리얼 >JS 클로저 사용을 위한 샘플 코드 공유

JS 클로저 사용을 위한 샘플 코드 공유

黄舟
黄舟원래의
2017-03-27 14:37:311677검색

이 글에서는 주로 JS 클로저의 사용법을 소개하고, javascript 클로저의 원리와 실행 단계, 관련 동작 스킬을 구체적인 예시를 통해 분석해보겠습니다. 다음

이 글의 예제에서는 JS 클로저의 사용법을 설명합니다. 참고할 수 있도록 자세한 내용은 다음과 같습니다.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title></title>
  </head>
  <body>
    <script type="text/javascript">
//      第一,函数作为返回值
      function fn(){
        var max = 10;
        return function bar(x){
          if(x > max) {
            console.log(x);
          }
        };
      }
      var f1 = fn();
      f1(15);
    </script>
    <script type="text/javascript">
//      第二,函数作为参数被传递
      var max = 10;
      fn = function(x){
        if(x > max){
          console.log(x);//15
        }
      };
      (function(f){
        var max = 100;
        f(15);
      })(fn);
    </script>
    <script>
      function fn(){
        var max = 10;
        return function bar(x){
          if(if > max){
            console.log(x);
          }
        };
      }
      var f1 = fn();
        max = 100;
      f1(15);
    </script>
  </body>
</html>

첫 번째 단계는 코드가 실행되기 전에 전역 컨텍스트 환경을 생성하고 변수가 실행 중입니다. 현재 전역 컨텍스트가 활성화되어 있습니다.

전역 컨텍스트: max가 정의되지 않음

두 번째 단계, var f1 = fn() 코드를 실행할 때 fn()을 호출하면 fn()이 발생합니다. 실행 컨텍스트가 스택에 푸시되고 활성 상태로 설정됩니다.

fn() context: max is 10

3단계, var f1 = fn();을 실행한 후 fn() 호출이 완료됩니다. fn()의 실행 컨텍스트를 삭제해야 하는 것은 당연한 일이지만 여기서는 이를 수행할 수 없습니다.

여기서 중요한 점이 있습니다. fn()이 실행되면 함수가 반환되기 때문입니다. 함수의 특별한 점은 독립적인 범위를 만들 수 있다는 것입니다.

반환된 함수 본문에는 fn 범위의 fn() 컨텍스트에서 max를 참조하는 자유 변수 max도 있습니다.

따라서 이 max는 소멸될 수 없습니다. 소멸된 후에는 bar 함수의 max 값을 찾을 수 없습니다. 따라서 여기서 fn() 컨텍스트는 파괴될 수 없으며 여전히 실행 컨텍스트 스택에 존재합니다.

max = 100;이 실행되면 전역 컨텍스트가 활성화되지만 fn() 컨텍스트는 여전히 실행 컨텍스트 스택에 남아 있습니다.

또한 max = 100이 실행된 후에는 전역 컨텍스트에서 max에 100이라는 값이 할당됩니다.

전역 컨텍스트: max는 100 fn() 컨텍스트: max는 10

4단계, f1(15)로 실행;, f1(15)을 실행합니다. 즉, bar(15)를 실행하고 bar(15) 컨텍스트를 생성한 후 활성 상태로 설정합니다.

bar(15) 실행시 max는 자유변수이고, bar 함수가 생성된 스코프에서 검색해서 max 값을 10으로 구해야 합니다.

여기서 중요한 점은 fn()이 실행될 때 bar 함수가 생성된다는 점입니다. fn()의 실행은 오래 전에 종료되었지만 fn()의 실행 컨텍스트는 여전히 스택에 존재하므로 bar(15)를 실행하면 max를 찾을 수 있습니다. fn() 컨텍스트가 파괴되면 max를 찾을 수 없습니다.

클로저를 사용하면 콘텐츠 오버헤드가 증가한다는 것은 이제 명백합니다!

f1(15)을 실행한 후의 다섯 번째 단계는 컨텍스트 환경의 파괴 프로세스이므로 여기서는 설명하지 않습니다.

클로저는 범위와 맥락에서 분리될 수 없습니다. 정말 “당신을 사랑하는 것은 쉽지 않습니다!”

게다가 클로저는 고전

프레임워크/클래스 라이브러리에 대해 배우고 싶든 jQuery의 많은 애플리케이션에서 사용됩니다. 플러그인이나 클래스 라이브러리를 직접 개발하려면 클로저, 프로토타입 등의 기본 이론을 알아야 합니다. 그렇지 않으면 버그가 나타날 때 이유를 알 수 없습니다. 이러한 버그는 완전히 귀하의 지식 범위를 벗어날 수 있기 때문입니다.

위 내용은 JS 클로저 사용을 위한 샘플 코드 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.