>웹 프론트엔드 >JS 튜토리얼 >당신의 친구의 JavaScript 코드가 실제로 클로저를 사용하고 있습니까?

당신의 친구의 JavaScript 코드가 실제로 클로저를 사용하고 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-01 06:11:02530검색

Is Your Friend's JavaScript Code Actually Using Closures?

JavaScript 클로저와 익명 함수

질문:

JavaScript 클로저에 대한 토론에서 한 친구가 다음과 같이 주장했습니다. 그들의 구현에는 폐쇄가 부족했고 다른 하나는 그 반대라고 주장했습니다. 클로저 개념을 적용하면 어떤 솔루션이 클로저를 사용하는지 알 수 있나요?

해결책:

클로저 정의: JavaScript에서 클로저는 다음을 의미합니다. 다른 범위에서 참조되는 자유 변수(상위 범위에 정의된 변수)가 있는 함수의 하위 집합입니다. 클로저가 상위 범위 외부에서 참조되면 해당 범위의 upvalue(자유 변수)를 닫습니다.

사례 1: 친구의 프로그램

<code class="js">for (var i = 0; i < 10; i++) {
    (function f() {
        var i2 = i;
        setTimeout(function g() {
            console.log(i2);
        }, 1000);
    })();
}</code>

분석:

  • 모든 자유 변수(i, setTimeout 및 console)가 전역 범위에 바인딩되어 있고 그 중 어느 것도 닫혀 있지 않기 때문에 함수 f는 클로저가 아닙니다. over.
  • 그러나 g 함수는 f의 범위에 바인딩된 변수 i2를 닫으므로 클로저입니다. setTimeout 내에서 g를 참조하면 i2에 대한 액세스 권한이 유지됩니다.

사례 2: 프로그램

<code class="js">for (var i = 0; i < 10; i++) {
    setTimeout((function f(i2) {
        return function g() {
            console.log(i2);
        };
    })(i), 1000);
}</code>

분석:

  • f 함수는 자유 변수가 없기 때문에 클로저가 아닙니다.
  • 그러나 g 함수는 바인딩된 변수 i2를 닫으므로 클로저입니다. f의 범위로. setTimeout 내에서 g가 참조되면 i2에 대한 액세스가 유지됩니다.

결론:

당신과 당신의 친구 모두 구현에서 클로저를 사용하고 있습니다. 차이점은 친구의 프로그램에서는 클로저가 내부 함수 g 내에서 생성되는 반면, 여러분의 프로그램에서는 클로저가 외부 함수 f 내에서 생성된다는 것입니다.

위 내용은 당신의 친구의 JavaScript 코드가 실제로 클로저를 사용하고 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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