전역변수의 문제점

채무·2024년 1월 30일

Web

목록 보기
5/11

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


변수의 생명 주기

  • 변수는 선언에 의해 생성되고, 할당을 통해 값을 갖는다
  • 변수는 자신이 선언된 위치에서 생성되고 소멸한다
  • 전역 변수의 생명 주기는 애플리케이션의 생명 주기와 같다
  • 함수 내부에서 선언된 지역 변수의 생명 주기는 함수의 생명 주기와 일치한다
  • 즉, 변수의 생명 주기는 메모리 공간이 확보된 시점부터 메모리 공간이 해제되어 가용 메모리 풀에 반환되는 시점까지이다

1) 지역 변수의 생명 주기

  • 함수 내부에서 선언된 지역 변수는 함수가 생성한 스코프에 등록된다
  • 변수는 자신이 등록된 스코프가 소멸(메모리 해제)될 때까지 유효하다

2) 전역 변수의 생명주기

전역 변수의 생명 주기 = 전역 객체의 생명 주기

  • 전역 객체는 코드 실행 이전에 자바스크립트 엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체다
  • 클라이언트 사이드 환경(브라우저)에서는 window 객체를 의미한다
  • 즉, var 키워드로 선언한 전역 변수는 window의 프로퍼티가 된다

전역 변수의 문제점

1) 암묵적 결합

모든 코드가 전역 변수를 참조하고 변경할 수 있는 암묵적 결합을 허용한다

  • 변수의 유효 범위가 커지면서 코드의 가독성은 나빠지고 의도치 않게 상태가 변경될 수 있는 위험성도 높아진다

2) 긴 생명 주기

  • 전역 변수를 생명 주기가 길기 때문에 메모리 리소스를 오랜 시간 소비한다
  • 또한 상태가 변경될 시간과 기회가 많기에, 변수 이름 중복으로 인한 의도치 않은 재할당이 이뤄질 수 있다

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

  • 변수를 검색할 때 전역 변수가 가장 마지막에 검색된다는 것을 의미한다
  • 즉, 전역 변수의 검색 속도가 가장 느리다(검색 속도 차이가 크진 않음)

4) 네임스페이스 오염

  • 파일이 분리되어 있어도 하나의 전역 스코프를 공유하기에, 다른 파일에서 동일한 이름의 전역 변수나 전역 함수가 같은 스코프 내에 존재할 경우 예상치 못한 결과를 가져올 수 있다

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

변수의 스코프는 좁을수록 좋다

1) 즉시 실행 함수

  • 모든 코드를 즉시 실행 함수로 감싸서 모든 변수는 즉시 실행 함수의 지역 변수로 만든다
(function () {
	var foo = 10; // 즉시 실행 함수의 지역 변수
    ...
}());

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

2) 네임 스페이스 객체

  • 전역에 네임스페이스 역할을 담당할 객체를 생성하고, 전역 변수처럼 사용하고 싶은 변수를 프로퍼티로 추가하는 방법이다
  • 하지만, 네임스페이스 객체 자체가 전역 변수에 할당되므로 별로 효과적이진 못하다
var MYAPP = {}; // 전역 네임스페이스 객체

MYAPP.name = 'Lee';

console.log(MYAPP.name); // Lee

3) 모듈 패턴

  • 모듈 패턴은 클래스를 모방해서 관련이 있는 변수와 함수를 모아 즉시 실행 함수로 감싸 하나의 모듈을 만든다
  • 모튤 패턴은 자바스크립트의 클로저를 기반으로 동작한다

4) ES6 모듈

  • ES6 모듈은 파일 자체의 독자적인 모듈 스코프를 제공한다
  • 모듈 내에서 선언한 변수는 전역 변수도, window 객체의 프로퍼티도 아니다
profile
개발한 기발자

0개의 댓글