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
。除了函数参数和目标对象之外,该执行上下文还接收到调用执行上下文的词法环境的链接,这意味着在外部词法环境中声明的变量(在上面的示例中,即 a
和 b
)可以从 ec
그 안에서 액세스됩니다.
모든 함수에는 외부 어휘 환경에 대한 링크가 있으므로 모든 함수는 클로저를 생성합니다.
클로저에 보이는 것은 복사본이 아닌 변수 자체라는 점에 유의하세요.
P粉9044059412023-08-23 00:50:56
클로저는 다음을 쌍으로 구성합니다.
어휘적 환경은 모든 실행 컨텍스트(스택 프레임)의 일부이며 식별자(예: 지역 변수 이름)와 값 간의 매핑입니다.
JavaScript의 모든 함수는 외부 어휘 환경에 대한 참조를 유지합니다. 이 참조는 함수가 호출될 때 생성되는 실행 컨텍스트를 구성하는 데 사용됩니다. 이 참조를 사용하면 함수가 호출되는 시기와 위치에 관계없이 함수 내부의 코드에서 함수 외부에 선언된 변수를 "볼" 수 있습니다.
다른 함수에서 함수가 호출되면 외부 어휘 환경에 대한 일련의 참조가 생성됩니다. 이 체인을 범위 체인이라고 합니다.
아래 코드에서 inner
与调用foo
时创建的执行上下文的词法环境形成了闭包,闭包包含变量secret
: