전역 변수의 문제점

정지훈·2020년 12월 1일
0

변수의 생명 주기는 짧으면 짧을 수록 성능면에서 좋다.

만약 변수에 생명 주기가 없다면 한번 선언된 변수는 프로그램을 종료하지 않는 한 영원히 메모리 공간을 점유하게 된다.

즉 변수를 전역에 선언을 하면 프로그램이 종료되지 않는 한 죽지를 않는다. 지역 변수를 쓰면 함수가 종료하면서 변수는 생명 주기가 종료된다.

function foo() {
  var x = 'local';
  console.log(x); // local
  return x;
}

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

전역에서 함수 내부의 x를 참조하려고 해도 참조에러가 발생을 한다.

그 이유는 x는 생명 주기가 종료 되었기 때문이다.

이것으로 알게되는건 지역변수의 생명 주기와 함수의 생명주기는 일치한다는 것이다.

하지만 일반적으로 함수가 종료하면 함수가 생성한 스코프도 소멸한다고 한다. 하지만 누군가가 스코프를 참조하고 있다면 스코프는 해제되지 않고 생존하게 되는데 이에 대해서는 클로저에서 자세히 살펴보도록 하자.

전역 변수의 생명 주기

전역변수의 생명주기는 모든 코드 블록이 끝나면 죽는다.
하지만 이 경우는 let과 const만 그런 것이고 var같은 경우 전역 객체의 생명 주기가 끝나야지 죽는다.
즉 애플리케이애이 종료되어야지만 var키워드로 변수가 생명 주기가 끝이 난다.

전역 변수의 문제점

전역변수는 일단 문제점이 있다.

첫 번째는 암묵적 결합을 허용한다는 것이다. 이것은 무엇이냐면 모든 코드가 전역변수를 참조하고 변경할 수 있어서 가독성이 떨어지고 의도치 않게 상태가 변경될 수 있는 위험성도 높아진다는 것이다.

두 번째는 위에서 부터 말했듯이 전역 변수는 생명 주기가 길다. 그래서 메모리를 오래 소비하고 또한 전역 변수의 상태를 변경할 수 있는 기회가 많아 진다.

var x = 1;

// ...

// 변수의 중복 선언. 기존 변수에 값을 재할당한다.
var x = 100;
console.log(x); // 100

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

스코프 체인 상에서도 종점에 위치해서 변수를 검색할때 가장 마지막에 검색 된다는 것을 말하고 검색 속도가 가장 느린것이 단점이다.

네임스페이스 오염

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

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

전역 변수의 무분별한 사용은 위험합니다. 전역 변수를 반드시 사용해야 할 이유를 찾지 못한다면 지역 변수를 사용해야 하고 변수의 스코프는 좁을수록 좋습니다. 하지만 전역 변수를 절대 사용하지 말라는 의미가 아닙니다.

일단 억제하는 방법은 첫 번째는 즉시 실행 함수를 써서 모든 변수를 지역 변수로 만드는 것 과 네임스페이스 객체를 만들어서 사용하고 싶은 변수를 프로퍼티로 추가하는 방법이고 세 번째는 모듈 패턴을 사용하는 것이다.

그리고 ES6에 나온 모듈화를 사용해 파일 자체를 모듈로서 동작하게 만드는 방법이 있습니다.

0개의 댓글