변수, 함수 등에 접근할 수 있는 범위 (Scope)
1
2
3
4
5
6
7
8
var global = '전역';
function foo() {
console.log(global); // '전역'
}
foo();
console.log(global); // '전역'
1
2
3
4
5
6
7
8
9
10
11
var global = '전역';
function foo() {
var local = '지역'
console.log(global); // '전역'
console.log(local); // '지역'
}
foo();
console.log(global); // '전역'
console.log(local); // Uncaught ReferenceError: local is not defined
변수는 선언한 위치(전역 또는 지역)에 따라 스코프가 결정된다.
var
를 사용한 전역변수는 전역객체인 window
의 프로퍼티이다.const
이나 let
을 사용하면 블록 레벨 스코프를 사용할 수 있다.함수 내에서 선언된 변수는 해당 함수 외부에서는 유효하지 않은 스코프이다.
함수가 유효범위이다!
1
2
3
4
5
6
7
8
9
function foo(){
if(true){
var bar = 'bar'
}
console.log(bar)
}
foo(); // bar
console.log(bar) // // Uncaught ReferenceError: bar is not defined
함수 레벨 스코프는 유연하지만, 그로 인해 버그 발생, 메모리 누수, 디버깅의 어려움 등의 문제가 발생하기 때문에 블록 레벨 스코프를 사용하는 것이 좋다고 한다.
블록({…}) 내에서만 유효한 스코프이다.
블록이 유효범위이다!
1
2
3
4
5
6
7
8
9
10
function foo(){
if(true){
let a = 'kim'
const b = 'lee'
}
console.log(a) //Uncaught ReferenceError: a is not defined
console.log(b) // Uncaught ReferenceError: b is not defined
}
foo();
함수를 어디서 호출하는지가 아니라 어디에 선언하였는지에 따라 스코프를 결정하는 것을 렉시컬 스코프 또는 정적 스코프라고 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // 1
bar(); // 1
해당 코드의 3번째 줄의 foo()
에서 bar()
를 호출하면, 호출한 foo()
스코프의 x
(4번째 줄) 가 아닌 bar()
를 선언한 위치인
전역 스코프의 x
(1번째 줄) 를 참조하기 때문에 두 함수의 결과는 1이 된다.