var x = 10;
function foo () {
y = 20;
}
foo();
console.log(x + y); // 30;
foo 함수 내의 y는 선언하지 않은 식별자입니다. 따라서 y = 20;
이 실행되면 참조 에러가 발생할 것처럼 보이지만 문제없이 잘 동작합니다. 이는 선언하지 않은 식별자에 값을 할당하면 전역 객체의 프로퍼티기 되기 때문입니다.
foo 함수가 호출되면 Javascript Engine은 y 변수에 값을 할당하기 위해 먼저 스코프 체인을 통해 선언된 변수인지 먼저 확인합니다. 만약 선언되지 않았었다면 y = 20
을 window.y = 20
으로 해석하여 전역 객체에 프로퍼티를 동적 생성합니다. 결국 y
는 전역 객체의 프로퍼티가 되어 마치 전역 변수처럼 동작하는데 이러한 현상을 암묵적 전역(implicit global)이라고 합니다.
y
는 변수가 아니라 단지 전역 객체의 프로퍼티에 지나지 않습니다. 즉, y
에 대해서는 변수 호이스팅이 발생하지 않습니다.delete
연산자로 삭제가 가능합니다. 전역 변수는 프로퍼티이지만 delete
연산자로 삭제할 수 없습니다.var x = 10;
function foo () {
y = 20;
console.log(x + y); // 30
}
foo();
console.log(window.x); // 10
console.log(window.y); // 20
delete x;
delete y;
console.log(window.x); // 10
console.log(window.y); // undefined