어휘적 환경은 모든 실행 컨텍스트(스택 프레임)의 일부이며 식별자(예: 지역 변수 이름)와 값 간의 매핑입니다.
JavaScript의 모든 함수는 외부 어휘 환경에 대한 참조를 유지합니다. 이 참조는 함수가 호출될 때 생성되는 실행 컨텍스트를 구성하는 데 사용됩니다. 이 참조를 사용하면 함수가 호출되는 시기와 위치에 관계없이 함수 내부의 코드에서 함수 외부에 선언된 변수를 "볼" 수 있습니다.
다른 함수에서 함수가 호출되면 외부 어휘 환경에 대한 일련의 참조가 생성됩니다. 이 체인을 범위 체인이라고 합니다.
아래 코드에서 inner与调用foo时创建的执行上下文的词法环境形成了闭包,闭包包含变量secret:
JavaScript에서 각 함수는 외부 어휘 환경에 대한 링크를 유지합니다. 어휘 환경은 범위 내의 모든 이름(예: 변수, 매개변수)과 해당 값의 맵입니다.
따라서
function
키워드를 볼 때마다 해당 함수 내부의 코드는 함수 외부에 선언된 변수에 액세스할 수 있습니다.이것은
16
,因为函数bar
闭包了参数x
和变量tmp
,它们都存在于外部函数foo
의 어휘 환경을 출력합니다.함수
bar
与其与函数foo
의 어휘 환경은 서로 연결되어 클로저를 형성합니다.함수는 클로저를 생성하기 위해 return 을 필요로 하지 않습니다. 선언만으로 각 함수는 둘러싸는 어휘 환경을 둘러싸서 클로저를 형성합니다.
위 함수는 더 이상 범위에 직접적으로 포함되지 않더라도
bar
中的代码仍然可以引用参数x
和变量tmp
때문에 16을 출력합니다.그러나
tmp
仍然存在于bar
的闭包中,它可以被递增。每次调用bar
부터는 모두 증가됩니다.클로저의 가장 간단한 예는 다음과 같습니다.
JavaScript 함수가 호출되면 새로운 실행 컨텍스트가 생성되고
ec
。除了函数参数和目标对象之外,该执行上下文还接收到调用执行上下文的词法环境的链接,这意味着在外部词法环境中声明的变量(在上面的示例中,即a
和b
)可以从ec
그 안에서 액세스됩니다.모든 함수에는 외부 어휘 환경에 대한 링크가 있으므로 모든 함수는 클로저를 생성합니다.
클로저에 보이는 것은 복사본이 아닌 변수 자체라는 점에 유의하세요.
클로저는 다음을 쌍으로 구성합니다.
어휘적 환경은 모든 실행 컨텍스트(스택 프레임)의 일부이며 식별자(예: 지역 변수 이름)와 값 간의 매핑입니다.
JavaScript의 모든 함수는 외부 어휘 환경에 대한 참조를 유지합니다. 이 참조는 함수가 호출될 때 생성되는 실행 컨텍스트를 구성하는 데 사용됩니다. 이 참조를 사용하면 함수가 호출되는 시기와 위치에 관계없이 함수 내부의 코드에서 함수 외부에 선언된 변수를 "볼" 수 있습니다.
다른 함수에서 함수가 호출되면 외부 어휘 환경에 대한 일련의 참조가 생성됩니다. 이 체인을 범위 체인이라고 합니다.
아래 코드에서
inner
与调用foo
时创建的执行上下文的词法环境形成了闭包,闭包包含变量secret
: