[모던 자바스크립트] 14. 전역 변수의 문제점

이상돈·2023년 7월 21일
0
post-thumbnail

14.1 변수의 생명 주기

14.1.1 지역 변수의 생명 주기

function foo(){
  var x = 'local';
  console.log(x); // local
  return x;
}
foo();
console.log(X); // ReferenceError : x is not defined

전역변수는 런타임 이전에 자바스크립트 엔진에 의해 먼저 생성되고 undefined로 초기화가 된다. 하지만 함수 내부에서 선언된 지역 변수는 함수가 호출되어 실행되는 동안에만 유효하다. 즉,지역변수의 생명 주기는 함수의 생명 주기와 일치한다.

var x = 'global';
function foo(){
  console.log(x); // (1) undefined
  var x = 'local';
}
foo();
console.log(x); // (2) global

(1)번 x는 foo()함수가 선언 되었을때의 var x = 'local'을 참조하여 값을 출력한다. 즉, foo함수 내부에서 x라는 변수가 호이스팅 되어 undefined로 초기화 되고 아직 'local'이라는 값을 할당하지 않았으므로 undefined가 출력된다. (2)번 x는 전역변수 var x = 'global'을 참조하여 출력한다.
이처럼 호이스팅은 스코프를 단위로 동작한다.

14.1.2 전역 변수의 생명 주기


var 키워드로 선언한 전역 변수의 생명 주기는 전역 객체의 생명 주기와 일치한다.

14.2 전역 변수의 문제점

암묵적 결합

전역 변수를 선언한 의도는 코드 어디서든 참조하고 할당할 수 있는 변수를 사용하겠다는 것이다. 이는 모든 코드가 전역 변수를 참조하고 변경할 수 있는 암묵적 결합을 허용하는 것이다.

긴 생명 주기

전역 변수는 생명 주기가 길다. 따라서 메모리 리소스도 오랜 기간 소비한다.

스코프 체인 상에서 종점에 존재

전역 변수는 스코프 체인 상에서 종점에 존재한다. 이는 변수를 검색할 때 전역 변수가 가장 마지막에 검색된다는 것을 말한다. 즉, 전역 변수의 검색 속도가 가장 느리다.

네임스페이스 오염

자바스크립트의 가장 큰 문제점 중 하나는 파일이 분리되어 있다고 해도 하나의 전역 스코프를 공유하는 것이다. 따라서 다른 파일 내에서 동일한 이름으로 명명된 전역 함수가 같은 스코프 내에 존재할 경우 예상치 못한 결과를 가져올 수 있다.

14.3 전역 변수의 사용을 억제하는 법

전역 변수를 반드시 사용해야 할 이유를 찾지 못한다면 지역 변수를 사용해야 한다. 변수의 스코프는 좁을수록 좋다.

14.3.1 즉시 실행 함수

(function(){
  var foo = 10;
  console.log(foo);
}())

console.log(foo); // RefereneceError : foo is not defined

모든 코드를 즉시 실행 함수로 감싸면 모든 변수는 즉시 실행 함수의 지역 변수가 된다.

profile
사람들의 더 나은 삶을 위한 개발자

2개의 댓글

comment-user-thumbnail
2023년 7월 21일

자바스크립트의 변수 생명 주기와 관련된 내용이 잘 정리되어 있네요. 특히 전역 변수의 문제점과 사용을 억제하는 방법에 대한 설명이 인상적입니다. 저에게도 많은 도움이 되었습니다. 감사합니다.

1개의 답글