(JS에 대해 공부 하면서 모던 자바스크립트 Deep Dive를 읽고 정리 요약한 내용입니다.)
특정 변수나 함수가 작동하는 유효범위. 자바스크립트는 다른 언어의 스코프와 구별되는 특징이 있으므로 유의 해야 한다.
자바스크립트 엔진이 식별자를 검색할 때 사용하는 규칙이라고 할 수도 있다. 모든 식별자(변수 이름, 함수 이름, 클래스 이름 등)는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 결정된다.
식별자는 어떤 값을 구별할 수 있어야 하므로 유일해야 한다. 따라서 식별자인 변수 이름은 중복될 수 없다. 하지만 모든 변수명을 달리 짓는 것은 무척 어렵기 때문에, 프로그래밍 언어에서는 스코프를 통해 식별자인 변수 이름의 충돌을 방지하여 같은 이름의 변수를 사용할 수 있게 한다. 스코프 내에서 식별자는 유일해야 하지만, 다른 스코프에는 같은 이름의 식별자를 사용할 수 있다. 즉 스코프는 네임스페이스다.
👉 네임스페이스?
이름공간 또는 네임스페이스(namespace)는 개체를 구분할 수 있는 범위를 나타내는 말로 일반적으로 하나의 이름 공간에서는 하나의 이름이 단 하나의 개체만을 가리키게 된다…
참고)https://ko.wikipedia.org/wiki/이름공간
변수는 자신이 선언된 위치(전역 or 지역)에 의해 스코프가 결정된다.
전역에서 선언된 변수는 전역 스코프를 갖는 전역 변수,
지역에서 선언된 변수는 지역 스코프를 갖는 지역 변수이다.
전역 변수는 함수 외부, 함수 내부 어디서든 참조할 수 있다.
지역이란 함수 몸체 내부를 말한다. 지역 변수는 자신의 지역 스코프와 하위 지역 스코프에서 유효하다.
함수는 중첩될 수 있으므로 함수의 지역 스코프도 중첩될 수 있다. 이는 스코프가 함수의 중첩에 의해 계층적 구조를 갖는다는 것을 말한다.
외부 함수
중첩 함수 outer
중첩 함수 inner
inner 함수는 outer의 중첩 함수.
outer 함수가 만든 지역 스코프는, inner 함수가 만든 지역 스코프의 상위 스코프.
outer 함수의 지역 스코프의 상위 스코프는 외부 함수 스코프이다.
모든 지역 스코프의 최상위 스코프는 전역 스코프이다. 이렇게 스코프가 계층적으로 연결된 것을 스코프 체인scope chain이라 한다.
변수를 참조할 때 자바스크립트 엔진은 변수를 참조하는 코드의 스코프에서 시작하여 상위 스코프 방향으로 이동하며 선언된 변수를 검색한다.
상위 스코프에서 유효한 변수는 하위 스코프에서 자유롭게 참조할 수 있지만, 하위 스코프에서 유효한 변수를 상위 스코프에서 참조할 수 없다.
함수도 식별자에 할당되기 때문에 스코프를 갖는다. 사실 함수는 식별자에 함수 객체가 할당된 것 외에는 일반 변수와 다를 바 없다. 따라서 스코프를 ‘변수를 검색할 때 사용하는 규칙’이라고 표현하기보다는 ‘식별자를 검색하는 규칙’이라고 표현하는 것이 좀 더 적합하다.
대부분의 프로그래밍 언어는 함수 몸체만이 아니라 모든 코드 블록(if, for, while, try/catch 등)이 지역 스코프를 만든다(블록 레벨 스코프 block level scope). 하지만 var 키워드로 선언된 변수는 오로지 함수의 코드 블록(함수 몸체)만을 지역 스코프로 인정한다(함수 레벨 스코프 function level scope)
var i = 10;
for (var i = 0; i < 5; i++) {
console.log(i); // 0, 1, 2, 3, 4
}
console.log(i); // 5
상위 스코프가 결정되는 방법에는 두 가지가 있다.
첫번째 방식을 동적 스코프dynamic scope라 한다. 함수를 정의하는 시점에는 함수가 어디서 호출될 지 알 수 없고, 함수가 호출되는 시점에 동적으로 상위 스코프를 결정해야 하기 때문이다.
두번째 방식을 정적 스코프static scope라 한다. 또는 렉시컬 스코프lexical scope라고도 한다. 함수 정의가 평가되는 시점에 상위 스코프가 정적으로 결정되기 때문이다.
자바스크립트를 비롯한 대부분의 언어가 렉시컬 스코프를 따른다.
[도서] 모던 자바스크립트 Deep Dive(이웅모 지음)