less than 1 minute read

a = 1;
b = 3;
console.log(a + b); // 4

위 예제와 같이 선언을 하지 않았는데, a와 b가 RefereneceError를 일으키지 않는다.

그 이유는 무엇일까?

암묵적 전역 객체

a와 b가 전역 객체인 window의 프로퍼티가 되기 때문이다.

이것을 암묵적 전역이라고 하는데, 자바스크립트 엔진은 먼저 a와 b가 선언된 변수인지

확인하는데, 스코프 어디에도 선언되지 않았다면 전역 객체의 프로퍼티로 해석한다.

a = 1; // window.a = 1;

하지만, a는 전역 객체의 프로퍼티가 되었을 뿐, 변수가 아니므로

호이스팅이 발생하지 않는다.

console.log(b); // ReferenceError: b is not defined

let a = 1;
{
  b = 10;
}
console.log(a + b); // 11
console.log(b); // 10
console.log(window.b); // 10

변수가 아니고, 전역 객체의 프로퍼티이기 때문에 delete 연산자로 삭제할 수 있다.

a = 10;

console.log(a); // 10

delete window.a;

console.log(a); // ReferenceError: a is not defined

Updated: