자바스크립트 Javascript

[JavaScript] 스코프와 클로져, Scope & Closure

맥캔지 2022. 4. 8. 22:30

 

스코프 레벨

1) 블록 레벨 스코프

대부분의 프로그래밍 언어

 

2) 함수 레벨 스코프

자바스크립트

let과 const 키워드 -> 블록 레벨 스코프를 갖기 위해 만들어짐.

ES6부터는 let, const 키워드를 사용하면 자바스크립트에서도 블록 레벨 스코프를 가질 수 있게 되었습니다.

 

 

자바스크립트는 정적 스코프, 즉 렉시컬 스코프이기 때문에 함수는 태어나자마자 상위 스코프가 결정이되기 때문에, 함수는 언제나 상위 스코프를 알 수 있게 됩니다. 자바스크립트에서 함수는 상위 스코프를 저장합니다.

 

함수 호출 -> 실행 컨텍스트 생성 -> 실행 컨텍스트 스택에 푸시 -> 렉시컬 환경 생성

 

먼저 호출된 함수의 실행 컨텍스트를 생성하고 이를 실행 컨텍스트 스펙에 푸시합니다. 그 후에 현주는 본인의 렉시컬 환경을 생성을 합니다. 렉시컬 환경이라는 것을 간단히 말해보자면 어떠한 코드가 어디서 실행이 되고 본인 주변에 어떤 코드들이 있는지 대체적인 정보를 담고 있는 환경이라고 할 수 있는데요.

 

렉시컬 환경 생성: 렉티컬 환경은 함수 본인 내부의 식별자 그리고 식별자의 바인딩 등 값 등을 기록하고 있는 하나의 자료 구조입니다.

 

코드의 실행이 끝나면 해당 콘텍스트에서 팝하여 제거합니다.

 

 

클로저란?

이미 생명주기가 끝난 내부함수를 참조할 수 있게 될 시, 참조가 가능해지는 내부함수를 클로저라고 합니다.

 

클로저의 과정

더해서 중첩 함수의 외부 함수보다 더 오래 살아있다면 유지가 된다면 이 중첩 함수는 클로저입니다. 이러한 클로저는 본인의 상의 스코프에서 현재 참조하는 식별자만을 기억을 합니다.

 

이러한 클로저는 하나의 스테이트가 의도치 않게 변경되지 않도록 스테이트를 안전하게 은닉하고 또는 특정 함수에게만 페이트 변경을 허용하기 위해 사용한다고 합니다.

 

참고

https://www.youtube.com/watch?v=PVYjfrgZhtU