이 글에서는 주로 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 103단계, 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는 104단계, 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!