스코프(scope)는 변수와 상수, 매개변수가 언제 어디서 정의되는지 결정합니다.
우리는 이미 스코프의 개념을 조금 접했습니다.
함수 매개변수가 함수 바디 안에서만 존재하는 것도 스코프의 한 예입니다.
다음 예제를 보십시오.
function f(x) {
return x + 3;
}
f(5); // 8
x; // ReferenceError: x is not defined
x가 아주 잠시나마 존재했었으니 x + 3을 계산할 수 있었습니다.
하지만 함수 바디를 벗어나면 x는 존재하지 않는 것처럼 보입니다.
따라서 우리는 x의 스코프가 함수 f라고 말합니다.
변수의 스코프가 어떤 함수라고 말할 때는, 함수를 실제 호출할 때까지는 함수 바디의 정해진 매개변수(formal argument) 가 존재하지 않음을 반드시 상기해야 합니다.
함수는 여러 번 호출할 수 있습니다.
그리고 함수를 호출할 때마다 매개변수가 나타나고, 함수가 제어권을 반환하면 스코프 밖으로 사라집니다.
변수와 상수는 만들기 전에는 존재하지 않는다는 것도 확실합니다.
즉, let이나 const로 선언하기 전에는 스코프 안에 존재하지 않습니다(var는 특수한 경우로 7장 후반에 설명합니다).
NOTE_
일부 언어는 선언(declaration)과 정의(definition) 을 명확히 구분합니다.
일반적으로 변수를 선언한다는 것은 식별자를 주어서 그 존재를 알리는 겁니다.
반면 정의는 선언과 함께 값도 부여하는 것을 말합니다.
자바스크립트에서는 모든 변수를 선언하는 동시에 값이 주어지므로(명시적으로 정하지 않으면 undefined가 암시적으로 주어지므로) 두 용어를 구분하지 않습니다.