찾다

 >  Q&A  >  본문

JavaScript 클로저는 어떻게 작동하나요?

<p>JavaScript 클로저(예: 함수, 변수 등)의 개념을 이해하지만 클로저 자체는 이해하지 못하는 사람에게 클로저를 설명하는 방법은 무엇입니까? </p> <p>Wikipedia에 제공된 Scheme 예제를 살펴봤지만 불행히도 도움이 되지 않았습니다. </p>
P粉494151941P粉494151941520일 전476

모든 응답(2)나는 대답할 것이다

  • P粉734486718

    P粉7344867182023-08-23 09:30:55

    JavaScript에서 각 함수는 외부 어휘 환경에 대한 링크를 유지합니다. 어휘 환경은 범위 내의 모든 이름(예: 변수, 매개변수)과 해당 값의 맵입니다.

    따라서 function 키워드를 볼 때마다 해당 함수 내부의 코드는 함수 외부에 선언된 변수에 액세스할 수 있습니다.

    으아아아

    이것은 16,因为函数 bar 闭包了参数 x 和变量 tmp,它们都存在于外部函数 foo의 어휘 환경을 출력합니다.

    함수 bar 与其与函数 foo의 어휘 환경은 서로 연결되어 클로저를 형성합니다.

    함수는 클로저를 생성하기 위해 return 을 필요로 하지 않습니다. 선언만으로 각 함수는 둘러싸는 어휘 환경을 둘러싸서 클로저를 형성합니다.

    으아아아

    위 함수는 더 이상 범위에 직접적으로 포함되지 않더라도 bar 中的代码仍然可以引用参数 x 和变量 tmp때문에 16을 출력합니다.

    그러나 tmp 仍然存在于 bar 的闭包中,它可以被递增。每次调用 bar부터는 모두 증가됩니다.

    클로저의 가장 간단한 예는 다음과 같습니다.

    으아아아

    JavaScript 함수가 호출되면 새로운 실행 컨텍스트가 생성되고 ec。除了函数参数和目标对象之外,该执行上下文还接收到调用执行上下文的词法环境的链接,这意味着在外部词法环境中声明的变量(在上面的示例中,即 ab)可以从 ec 그 안에서 액세스됩니다.

    모든 함수에는 외부 어휘 환경에 대한 링크가 있으므로 모든 함수는 클로저를 생성합니다.

    클로저에 보이는 것은 복사본이 아닌 변수 자체라는 점에 유의하세요.

    회신하다
    0
  • P粉904405941

    P粉9044059412023-08-23 00:50:56

    클로저는 다음을 쌍으로 구성합니다.

    1. 함수와
    2. 함수의 외부 범위(어휘적 환경)에 대한 참조

    어휘적 환경은 모든 실행 컨텍스트(스택 프레임)의 일부이며 식별자(예: 지역 변수 이름)와 값 간의 매핑입니다.

    JavaScript의 모든 함수는 외부 어휘 환경에 대한 참조를 유지합니다. 이 참조는 함수가 호출될 때 생성되는 실행 컨텍스트를 구성하는 데 사용됩니다. 이 참조를 사용하면 함수가 호출되는 시기와 위치에 관계없이 함수 내부의 코드에서 함수 외부에 선언된 변수를 "볼" 수 있습니다.

    다른 함수에서 함수가 호출되면 외부 어휘 환경에 대한 일련의 참조가 생성됩니다. 이 체인을 범위 체인이라고 합니다.

    아래 코드에서 inner与调用foo时创建的执行上下文的词法环境形成了闭包,闭包包含变量secret:

    으아악

    회신하다
    0
  • 취소회신하다