>  기사  >  웹 프론트엔드  >  js 클로저에 대한 간단한 이해

js 클로저에 대한 간단한 이해

一个新手
一个新手원래의
2017-10-10 10:09:461507검색

Closure 정의:

클로저는 다른 함수 범위에 있는 변수에 액세스할 수 있는 함수를 나타냅니다.

여기에서는 또 다른 정의가 사용됩니다.

함수가 정의될 ​​때 어휘 범위 외부에서 호출되더라도 함수가 자신이 속한 어휘 범위를 기억하고 액세스할 수 있을 때 클로저가 발생합니다.

첫 번째 요점: JavaScript는 어휘 범위를 기반으로 합니다. 어휘 범위는 코드 작성 시 함수 선언의 위치에 따라 범위가 결정된다는 의미입니다.
어휘 범위 검색 규칙: 일치하는 첫 번째 식별자가 발견되면 범위 검색이 중지됩니다. 동일한 이름을 가진 식별자는 여러 수준의 중첩된 범위에서 정의될 수 있으며, 이를 "섀도잉 효과"(내부 식별자는 외부 식별자를 "섀도우")라고 합니다. 섀도잉 효과에 관계없이 범위 검색은 항상 런타임이 위치한 가장 안쪽 범위에서 시작하여 일치하는 첫 번째 식별자를 찾을 때까지 바깥쪽 또는 위쪽으로 진행됩니다.
함수를 어디서 호출하든, 어떻게 호출하든 어휘 범위는 함수가 선언된 위치에 의해서만 결정됩니다.
두 번째 요점: JavaScript에는 함수 기반 범위가 있으며 함수는 JavaScript에서 가장 일반적인 범위 단위입니다. 함수 범위는 이 함수에 속하는 모든 변수를 전체 함수의 범위 내에서 사용하고 재사용할 수 있으며(실제로 중첩된 범위에서도 사용할 수 있음) 외부 범위는 래퍼 함수 내부의 모든 항목에 액세스할 수 없음을 의미합니다.
세 번째 요점: JavaScript의 함수는 일급 객체입니다
1) 변수, 배열 요소 및 기타 객체에 할당할 수 있는 속성
​ 2) 함수에 매개변수로 전달될 수 있습니다
3) 함수의 반환 값으로 사용할 수 있습니다.
네 번째 요점: 클로저

function foo() {
    var a = 2;    
    function bar() {
        console.log( a ); // 2。bar()对 a 的引用的方法是词法作用域的查找规则,而这些规则只是闭包的一部分
    }
    bar();
}
foo();

위 코드는 실제로 클로저를 사용하지 않습니다. 클로저의 적용은 일반적으로 반환 값으로서의 함수와 반환 값으로서의 함수의 두 가지 상황으로 나뉩니다. 매개변수.
위 코드를 다시 작성하세요.

function foo() {
    var a = 2;    
    function bar() {
    console.log( a );
    }    return bar;//函数作为返回值}var baz = foo();
baz(); // 2 —— 朋友,这就是闭包的效果。

여기서 bar() 함수의 어휘 범위는 foo()의 내부 범위에 액세스할 수 있습니다. 그런 다음 bar() 함수 자체를 값 유형으로 전달합니다. 이 예에서는 bar 자체가 참조하는 함수 개체를 반환 값으로 사용합니다.
이 예에서 bar()는 정의된 어휘 범위 외부에서 실행됩니다. foo() 함수가 반환된 후에도 내부 범위는 여전히 존재하고 bar()는 여전히 범위에 대한 참조를 보유하며 이 참조를 클로저라고 합니다.
함수를 매개변수로 전달하는 또 다른 예를 작성하세요:

var max = 10,
fn = function(x) {
    if (x > max) {//注意词法作用域规则,这里的max是10,而不是100.
        console.log(x);  //15
    }
};
(function(f) {
    var max = 100;
    f(15);
})(fn);

다섯 번째 요점: JavaScript의 가비지 수집 메커니즘 GC

js에서 객체가 더 이상 참조되지 않으면 해당 객체는 GC에 의해 재활용되고, 그렇지 않으면 객체가 재활용됩니다. 항상 메모리에 저장됩니다

포인트 6: 실행 환경, 활성 객체, 범위 및 범위 체인

실행 환경의 모든 코드가 실행된 후에는 환경이 파괴되고 거기에 저장된 모든 변수와 함수도 파괴됩니다. .
함수가 호출되면 실행 환경과 해당 범위 체인이 생성되고 인수 및 기타 명명된 매개 변수의 값을 사용하여 활성 개체가 초기화됩니다.

그러나 어떤 경우에는 함수 호출이 완료된 후 실행 환경의 범위 체인이 삭제되지만 해당 활성 개체는 여전히 메모리에 남아 있습니다. 이것이 클로저에 대해 이해해야 할 핵심입니다.

위 내용은 js 클로저에 대한 간단한 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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