블록문
- 0개 이상의 문들을 묶은 단위
- 일반적으로 제어문, 함수 등에 사용
- 새로운 스코프를 생성
스코프
- 변수나 상수 식별자들이 유효하게 사용될 수 있는 범위
- 블록 안쪽에서는 바깥쪽의 식별자 접근 가능
let global = "global"
{
const x = "hello";
let y = "world";
console.log(global);
console.log(x, y);
}
// 에러 블록 스코프 범위에서 벗어남
console.log(x, y);
console.log(global)
- 블록 안쪽에 변수산 상수가 새로 선언되면 바깥 것을 덮어씀
const xx = 0;
let yy = 'Hello!';
console.log(xx, yy);
{
const xx = 1; // 💡 블록 안에서는 바깥의 const 재선언 가능
let yy = '안녕하세요~';
console.log(xx, yy);
// ⚠️ const, let을 빼먹으면 재선언이 아니라 바깥것의 값을(변수면) 바꿈!
}
console.log(xx, yy);
스코프 체인 scope chain
- 식별자의 유효범위를 안에서부터 바깥은로 차레로 검색해 나가는 것을 말합니다.
- 외부환경참조(OuterEnviromentReference)를 통해 함수 호출된 시점의 상위 렉시컬 환경(LexicalEnvironment)에 접근하여 변수나 상수를 찾을 수 있음
- 외부 환경 참조는 오직 자신이 선언된 시점의 정적 환경만 참조하고 있으므로 가장 가까운 요소부터 차례대로 접근 ⇒ 후입선출 방식
var a = 1;
let outer2 = function () {
let inner2 = function () {
console.log(a); // undefined : 아래 var에 의해 inner2 함수 스코프 안에서 호이스팅도되어
// 선언은 되었지만 초기화되지 않았으므로 undefined가 반환됨
var a = 3; // 변수의 은닉화 전역 변수(a)에 접근하지 못함
};
inner2();
console.log(a); // 1
};
outer2();
console.log(a); // 1
전역 global 변수/상수