범위, 영역을 뜻한다.
프로그래밍에서의 Scope = 변수를 참조할 수 있는(== 접근할 수 있는)
유효한 범위 OR 식별자(변수, 함수, 클래스)가 유효한 범위
{}
즉, 식별자(변수)는 최대한 필요한 곳에서 정의해야 한다.
예시
// 코드 블럭 : {}, if() {}, for() {}, function() {}
// 블럭 외부에서는 블럭 내부의 변수를 참조할 수 없다. ❌
{
const a = "a";
console.log(" a : ", a);
}
const b = "b";
// console.log(" a : ", a);
코드 블럭 안에서는 제대로 a가 출력된다.
// 함수 외부에서는 함수 내부의 변수를 참조할 수 없다. ❌
function print() {
const message = "Hello World";
console.log(" message : ", message);
}
// console.log(" message : ", message); 함수 안에서 선언된 변수는 함수 스코프 안에서만 참조가능.
print();
// 함수 외부에서는 함수 내부의 변수를 참조할 수 없다. ❌
function sum(a, b) {
console.log(" a,b : ", a, b);
}
// console.log(" a,b : ", a, b); 매개변수도 함수 scope 안에서만 참조가능.
하지만 블럭 바깥에서 실행한 console에서는 아래 참조에러가 뜨게 된다.
**ReferenceError: a is not defined**
Scope 참조 예제
{
const x = 1;
{
const y = 2;
console.log(" x : ", x); // 상위 스코프 변수에 참조가능. 변수 x = 1
}
console.log(" x : ", x); // 같은 스코프 변수 참조가능. 변수 x = 1
// console.log(" y : ", y); // 하위 스코프 변수는 참조 불가능. (== 밖에서는 내부 변수 참조 불가!!!) Error
}
const text = "global"; // 전역 변수, 전역 스코프 (글로벌 변수,글로벌 스코프)
{
const text = "inside block 1"; // 지역 변수(로컬 변수), 지역 스코프(로컬 스코프)
{
// const text = "inside block 2"; 만약에 해당 변수가 활성화 상태라면, inside block 2가 출력될 것임. (가장 가까운 스코프이기 때문)
console.log(" text : ", text); // 상위 스코프 변수에 참조가능. inside block 1 출력.
}
}
자바스크립트 엔진 백그라운드 프로세스
정리
// 자바스크립트 엔진 백그라운드 프로세스
// 변수는 글로벌하게 쓰는 것 보다 필요한 곳에서 쓰는 것이 좋다.
// 블럭 안, 클래스 안, 함수 안, 모듈 안, 조건문 안에서 등
// 글로벌 변수는 앱이 종료될때까지 계속 메모리에 유지된다.
const global = 1;
{
//블럭 내부에서만 존재하고, 블럭이 끝나면 자동으로 소멸된다. (GC)
const local = 1;
}
function print() {
// 함수 내부에서도 블럭안에서 필요한 경우에는
// (필요한 곳에서!) 블럭 안에서 변수를 선언하고 사용해야 한다.
if (true) {
let temp = 0;
}
}