스코프 scope
모든 식별자(변수 이름, 함수 이름, 클래스 이름 등)가 유효한 범위
모든 식별자는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 결정된다.
var var1 = 1;
if (true) {
var var2 = 2;
if (true) {
var var3 = 3;
}
}
function foo() {
var var4 = 4;
function bar() {
var var5 = 5;
}
}
console.log(var1); // 1
console.log(var2); // 2
console.log(var3); // 3
console.log(var4); // ReferenceError: var4 is not defined
console.log(var5); // ReferenceError: var5 is not defined
식별자 결정 identifier resolution
자바스크립트 엔진이 이름이 같은 변수 중 어떤 변수를 참조해야 할 것인지 스코프를 통해 결정하는 것.
따라서, 스코프란 자바스크립트 엔진이 식별자를 검색할 때 사용하는 규칙이라고도 할 수 있다.
자바스크립트 엔진은 코드를 실행할 때 코드의 문맥(context)을 고려한다. 코드가 어디서 실행되며 주변에 어떤 코드가 있는지에 따라 동일한 코드도 다른 결과를 만들어낸다.
var x = "global";
function foo() {
var x = "local";
console.log(x); // local
}
foo(x);
console.log(x); // global
렉시컬 환경 lexical environment
코드가 어디서 실행되며 주변에 어떤 코드가 있는지에 대한 정보를 담고 있다.
코드의 문맥(context)은 렉시컬 환경으로 이루어진다. 이를 구현한 것이 실행 컨텍스트(execution context)이며, 모든 코드는 실행 컨텍스트에서 평가되고 실행된다.
스코프는 네임스페이스다.