모든 식별자(변수 이름, 함수 이름, 클래스 이름 등)는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 결정됨
= 스코프는 식별자가 유효한 범위
= 식별자를 검색할 때 사용하는 규칙
var x = "global";
function foo() {
var x = "local";
console.log(x);
}
foo(); // local
console.log(x); // global
| 구분 | 설명 | 스코프 | 변수 |
|---|---|---|---|
| 전역 | 코드의 가장 바깥 영역 | 전역 스코프 | 전역 변수 |
| 지역 | 함수 몸체 내부 | 지역 스코프 | 지역 변수 |
= 스코프가 계층적으로 연결된 것
function foo() {
console.log("global function foo");
}
function bar() {
function foo() {
console.log("local function foo");
}
foo();
}
bar(); // local function foo
함수도 식별자에 할당되기 때문에 스코프를 가짐
→ 식별자를 검색하는 규칙의 표현이 적합
코드 블록이 아닌 함수에 의해서만 지역 스코프가 생성됨
var x = 1;
if (true) {
// var 키워드로 선언된 변수는 함수의 코드 블록(함수 몸체)만을 지역 스코프로 인정
// x는 전역 변수, 이미 선언된 전역 변수 x가 있으므로 x는 중복 선언됨
// 이는 의도치 않게 변수 값이 변경되는 부작용을 발생시킴
var x = 10;
}
console.log(x); // 10
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // 1
bar(); // 1