전역 변수는 쓰지마라
라는 말은 누구나 한 번쯤 들어봤을 것이라 생각한다.
그렇다면 왜 사용하면 안될까?
해당 책에서는 4가지 측면에서 문제점이 있다고 기술하고 있다.
간단히 정리하자면
- 스코프 체인 상에서 종점에 존재한다.
- 암묵적 결합을 허용한다.
- 생명주기가 길다.
- 네임스페이스를 오염시킨다.
목차별로 하나씩 기억하려하니 연결되지 않는 느낌을 받아 논리적으로 차근차근 이해해보기로 했다.
우선 전역변수란 무엇일까?
전역변수란 전역에서 선언된 변수로써 전역 스코프 내에 존재하는 변수다
이 말은 이전에 설명한 스코프체인에서 가장 종점(탐색범위 끝)에 위치하고 있다는 것을 뜻한다.
이렇게 되면 전역변수를 찾기위해 스코프체인의 종점까지 이동이 필요하고 그만큼 시간이 소요됨을 뜻한다.
물론 컴퓨터입장에서 그 정도 시간은 금방 처리하기에 큰 문제라고 할 수는 없지만 개발자로써 알아야하는 부분이라고 생각한다.
앞에서 전역변수는 전역스코프 내에서 존재한다고 했다.
이 말은 전체 코드블록에서 어디든 참조하고 사용할 수 있다는 뜻으로써
예상치 못한 변경이 일어날 수 있음을 뜻한다.
이전의 스코프체인 상에서 종점에 존재하기에 시간이 소요되는 점은 큰 문제가 아니었지만 이런 예상치 못한 변경이 일어날 수 있는 가능성은 큰 문제이다. 어디서 변경이 일어났는지 예측하기도 어렵고 인간은 실수하는 동물이기에 var
키워드를 쓸 경우 중복선언이 허용되므로 예상치 못한 오류도 발생할 수 있기때문에 매우 크리티컬한 문제이다.
우선 변수의 생명주기는 무엇에 의해 결정될까?
당연히 자신의 스코프와 생명주기를 함께한다.
우선 지역변수의 경우 예측이 쉽다. var
키워드의 경우는 함수레벨 스코프이기 때문에 함수가 끝나면 생명주기가 끝난다.
let,const
키워드는 블록레벨 스코프이기 때문에 블록이 끝나면 생명주기가 끝난다.
하지만 전역변수는 무엇과 생명주기를 함께할까?
바로 애플리케이션(브라우저 등등)과 생명주기를 함께한다.
이 말은 애플리케이션이 종료되지 않으면 애플리케이션과 함께 계속 메모리 공간을 차지하고 있기 때문에 지역변수의 생명주기와는 비교도 안될 만큼 오랫동안 살아있게 되므로 메모리 리소스를 오랜 기간 소비한다는 단점이 있다.
JS는 파일이 분리되어있더라도 하나의 전역 스코프를 공유한다.
이 말은 다른 파일에서 동일한 이름으로 선언된 전역 변수가 있다면 예상치 못한 오류를 발생시킬 수 있다는 것을 뜻한다.
문제가 있었으니 당연히 해결방법이 있다.
강제적으로 스코프를 한정시키는 방법이다
(function() {
var foo = 10; // 즉시 실행함수의 지역변수
}());
console.log(foo); // ReferenceError: foo is not defined
전역에 네임스페이스 역할을 담당할 객체를 만들고 전역변수처럼 사용할 변수를 프로퍼티로 추가해 사용하는 방법이다
var MYPROJECT = {}; // 전역 네임스페이스 객체
MYPROJECT.name = 'Son';
console.log(MYPROJECT.name); // Son
이 외에도 모듈패턴이나 ES6모듈을 사용하는 방법이 있으나 조금 더 공부가 필요하기에 추후 따로 글을 작성하려한다.