암묵적 전역

정수·2023년 3월 15일
0

JavaScript

목록 보기
11/15
post-thumbnail
var x = 10;
function foo () {
  y = 20;
}
foo();

console.log(x + y); // 30;

foo 함수 내의 y는 선언하지 않은 식별자입니다. 따라서 y = 20;이 실행되면 참조 에러가 발생할 것처럼 보이지만 문제없이 잘 동작합니다. 이는 선언하지 않은 식별자에 값을 할당하면 전역 객체의 프로퍼티기 되기 때문입니다.

foo 함수가 호출되면 Javascript Engine은 y 변수에 값을 할당하기 위해 먼저 스코프 체인을 통해 선언된 변수인지 먼저 확인합니다. 만약 선언되지 않았었다면 y = 20window.y = 20으로 해석하여 전역 객체에 프로퍼티를 동적 생성합니다. 결국 y는 전역 객체의 프로퍼티가 되어 마치 전역 변수처럼 동작하는데 이러한 현상을 암묵적 전역(implicit global)이라고 합니다.

변수 선언과의 차이점

  1. 암묵적 전역으로 생성된 y변수가 아니라 단지 전역 객체의 프로퍼티에 지나지 않습니다. 즉, y에 대해서는 변수 호이스팅이 발생하지 않습니다.
  2. 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
profile
해피한하루

0개의 댓글