오늘은 전역변수의 문제점에 대해서 포스팅하려고 한다

변수의 생명 주기
- 변수는 선언에 의해 생성되고, 할당을 통해 값을 갖는다
- 변수는 자신이 선언된 위치에서 생성되고 소멸한다
- 전역 변수의 생명 주기는 애플리케이션의 생명 주기와 같다
- 함수 내부에서 선언된 지역 변수의 생명 주기는 함수의 생명 주기와 일치한다
- 즉, 변수의 생명 주기는 메모리 공간이 확보된 시점부터 메모리 공간이 해제되어 가용 메모리 풀에 반환되는 시점까지이다
1) 지역 변수의 생명 주기
- 함수 내부에서 선언된 지역 변수는 함수가 생성한 스코프에 등록된다
- 변수는 자신이 등록된 스코프가 소멸(메모리 해제)될 때까지 유효하다
2) 전역 변수의 생명주기
전역 변수의 생명 주기 = 전역 객체의 생명 주기
- 전역 객체는 코드 실행 이전에 자바스크립트 엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체다
- 클라이언트 사이드 환경(브라우저)에서는 window 객체를 의미한다
- 즉, var 키워드로 선언한 전역 변수는 window의 프로퍼티가 된다
전역 변수의 문제점
1) 암묵적 결합
모든 코드가 전역 변수를 참조하고 변경할 수 있는 암묵적 결합을 허용한다
- 변수의 유효 범위가 커지면서 코드의 가독성은 나빠지고 의도치 않게 상태가 변경될 수 있는 위험성도 높아진다
2) 긴 생명 주기
- 전역 변수를 생명 주기가 길기 때문에 메모리 리소스를 오랜 시간 소비한다
- 또한 상태가 변경될 시간과 기회가 많기에, 변수 이름 중복으로 인한 의도치 않은 재할당이 이뤄질 수 있다
3) 스코프 체인 상에서 종점에 존재
- 변수를 검색할 때 전역 변수가 가장 마지막에 검색된다는 것을 의미한다
- 즉, 전역 변수의 검색 속도가 가장 느리다(검색 속도 차이가 크진 않음)
4) 네임스페이스 오염
- 파일이 분리되어 있어도 하나의 전역 스코프를 공유하기에, 다른 파일에서 동일한 이름의 전역 변수나 전역 함수가 같은 스코프 내에 존재할 경우 예상치 못한 결과를 가져올 수 있다
전역 변수의 사용을 억제하는 방법
변수의 스코프는 좁을수록 좋다
1) 즉시 실행 함수
- 모든 코드를 즉시 실행 함수로 감싸서 모든 변수는 즉시 실행 함수의 지역 변수로 만든다
(function () {
var foo = 10;
...
}());
console.log(foo);
2) 네임 스페이스 객체
- 전역에 네임스페이스 역할을 담당할 객체를 생성하고, 전역 변수처럼 사용하고 싶은 변수를 프로퍼티로 추가하는 방법이다
- 하지만, 네임스페이스 객체 자체가 전역 변수에 할당되므로 별로 효과적이진 못하다
var MYAPP = {};
MYAPP.name = 'Lee';
console.log(MYAPP.name);
3) 모듈 패턴
- 모듈 패턴은 클래스를 모방해서 관련이 있는 변수와 함수를 모아 즉시 실행 함수로 감싸 하나의 모듈을 만든다
- 모튤 패턴은 자바스크립트의 클로저를 기반으로 동작한다
4) ES6 모듈
- ES6 모듈은 파일 자체의 독자적인 모듈 스코프를 제공한다
- 모듈 내에서 선언한 변수는 전역 변수도, window 객체의 프로퍼티도 아니다