scope(범위)
변수의 유효한 범위를 말한다. (= 변수가 선언되는 문맥)
전역범위에서 변수는 블록 외부에서 선언된다.(global variable, 전역변수) 블록 내부에 바인딩되어 있지 않기 때문에 블록 내 코드를 포함하여 프로그램의 모든 코드로 접근될 수 있다.
변수가 블록 {}
안에서 선언되면 이 변수는 블록 내에서만 유효하게 된다. 이렇게 블록 내에서만 사용될 수 있는 변수를 local variable(지역변수)라고 한다.
const logSkyColor = () => {
let color = 'blue';
console.log(color); // blue
};
logSkyColor(); // blue
console.log(color); // ReferenceError
전역변수를 너무 많이 선언할 경우 또는 다른 스코프 안의 변수를 재사용하는 경우 생긴다.
다른변수를 추적하는 것이 어려워지고, 지역변수와 충돌하는 등 문제를 일으킬 위험이 있다.
let num = 50;
const logNum = () => {
num = 100; // Take note of this line of code
console.log(num);
};
logNum(); // Prints 100
console.log(num); // Prints 100
블록 내에 변수를 선언하게 되면 코드가 읽기 쉬워지고, 블록 내에서 변수가 분명하게 정의되어 코드를 이해하기 쉬워지기 때문이다. 또한 코드를 유지하기 쉬워지고 메모리를 절약한다.(블록 작동이 끝나면 코드가 중단되므로)
let i = 5;
function a() {
let i = 10;
b();
}
function b() {
console.log(i);
}
a();
// 5
함수b가 실행될 때 함수 안에 i라는 전역변수가 있는지 먼저 찾게된다. b가 실행된 시점에(사용될 때) 변수 i가 사용되는 것이 아니라, b가 정의될 때의 변수, 즉 전역변수가 사용된다. => 정적유효범위(lexical scoping)라고 한다.
함수b가 사용되는 대상에 따라서 그 대상이 갖고 있는 변수에 접근한다면 그것은 동적 유효범위가 된다.