📖 모든 식별자는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 결정된다.
➡ 식별자가 유효한 범위
📖 전역(global) : 코드의 가장 바깥 영역
➡ 전역에 변수를 선언하면 전역 스코프를 갖는 전역 변수가 된다.
💡 전역 변수는 어디서든지 참조할 수 있다.
📖 지역(local) : 함수 몸체 내부
➡ 지역에 변수를 선언하면 지역 스코프를 갖는 지역 변수가 된다.
💡 지역 변수는 자신의 지역 스코프와 하위 지역 스코프에서 유효하다.
📖 스코프는 함수의 중첩에 의해 계층적 구조를 가진다.
➡ 스코프가 계층적으로 연결된 것을 스코프 체인(scope chain)이라고 한다.
💡 변수를 참조할 때 자바스크립트 엔진은 scope chain을 통해 변수를 참조하는 코드의 scope에서 시작하여 상위 scope 방향으로 이동하며 선언된 변수를 검색한다.
➡ 상위 scope에서 유효한 변수는 하위 scope에서 자유롭게 참조할 수 있지만 하위 scope에서 유효한 변수를 상위 scope에서 참조할 수 없다.
💡 local scope는 function에 의해서만 생성된다.
➡ 이러한 특성을 함수 레벨 스코프(function level scope)라 한다.
📖 var
로 선언된 변수 : function level scope
let
, const
로 선언된 변수: block level scope
📖 동적 스코프(dynamic scope) : 함수를 어디서 호출했는지에 따라 함수의 상위 scope를 결정한다.
📖 렉시컬 스코프(lexical scope) : 함수를 어디서 정의했는지에 따라 함수의 상위 scope를 결정한다.
➡ 자바스크립트는 lexical scope를 따른다.
📕 참조 : 모던 자바스크립트 Deep Dive