DEEP DIVE - 14장 전역 변수의 문제점

Mudi·2022년 10월 27일
0

[Book] Deep Dive

목록 보기
2/5
post-thumbnail

전역 변수의 문제점


무분별한 전역 변수 사용은 위험하다고 합니다. 전역 변수의 문제점과 사용을 억제하는 방법을 살펴보도록 하겠습니다.

변수의 생명 주기

변수는 선언에 의해 생성되고 할당을 통해 값을 갖습니다. 그리고 언젠가는 소멸합니다.
이 과정이 생물과 비슷하다하여 이를 변수의 생명 주기 (life cycle)라고 부릅니다.
변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체이기 때문에 변수의 소멸은 곧 메모리 차지와 관련이 있습니다.

변수의 생명 주기
메모리 공간 확보 (allocate)
⬇️
메모리 공간 해제 (release)
⬇️
가용 메모리 풀(memory pool)에 반환

지역 변수의 생명 주기
지역 변수의 생명 주기는 대부분 함수의 생명 주기와 일치하지만 예외가 있습니다. 누군가가 자신이 선언 된 스코프를 참조하고 있을 때 소멸되지 않고 생존합니다.

	[지역 변수의 소멸]
    - 자신이 등록된 스코프가 소멸
    - 일반적으로는 함수가 종료될 때 스코프 소멸
    - 누군가가 참조하고 있다면 스코프는 해제되지 않고 생존

호이스팅
지역 스코프에서 호이스팅은 해당 스코프 내에서 최상단으로 끌어올려집니다. 즉 호이스팅은 스코프 단위로 이루어 집니다.

전역 변수의 생명 주기
전역 변수는 전역 객체의 생명 주기와 일치합니다. 즉, 웹 페이지를 닫을 때 까지 유효합니다.


전역 변수의 문제점

암묵적 결합
선언 의도와 다르게 상태가 변경될 수 있는 위험이 높습니다.

긴 생명 주기
생명 주기가 길다는 것은 그만큼 메모리 리소스를 오랜 기간 소비한다는 뜻입니다. 또 역시 긴 생명 주기동안 상태 변경에 의한 오류가 발생될 확률이 높습니다.

검색의 속도가 가장 느림
전역 변수는 스코프 체인의 종점에 위치하고 있어 가장 마지막에 검색됩니다. 물론 큰 차이가 있는 것은 아니지만, 그렇다고 차이가 없는 것은 아니므로 효율적이지 않습니다.

네임스페이스 오염
자바스크립트를 분리하여 작업한다면 동일한 이름의 전역 변수 또는 전역 함수가 충돌할 위험이 있습니다.


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

변수의 스코프는 좁을수록 좋다고 합니다. 전역 변수 사용을 억제하는 방법은 다음과 같습니다.

즉시 실행 함수
모든 코드를 즉시 실행 함수로 감싸면 모든 변수는 즉시 실행 함수의 지역 변수가 됩니다.
이 방법은 라이브러리 등에 자주 사용됩니다.

네임스페이스 객체
전역에 네임스페이스 역할을 담당하는 객체를 생성하여 전역 변수로 사용할 변수를 프로퍼티로 추가하는 방법입니다. 객체로 관리하여 충돌을 방지할 수 있다는 장점은 있으나 객체 자체가 전역 변수에 할당되므로 그다지 유용한 방법은 아닙니다.

모듈 패턴
모듈 패턴은 자바스크립트의 클로저 기능을 동반하여 동작합니다. 캡슐화를 구현하여 정보 은닉(객체의 특정 프로퍼티나 메서드를 감출 목적으로 사용하는 것)의 기능과 네임스페이스 오염을 막는 역할을 할 수 있습니다.

ES6 모듈
ES6 모듈은 파일 자체의 독자적인 모듈 스코프를 제공합니다. 즉 모듈 내에서 var 키워드로 선언한 변수는 더는 전역 변수가 아니게 됩니다. script 태그에 type="module" 어트리뷰트를 추가하면 로드된 자바스크립트 파일은 모듈로서 동작합니다. (확장자 mjs 권장)

// 예제
<script type="module" src="lib.mjs"></script>

호환 관련
ES6 모듈은 구형 브라우저에서는 동작하지 않으며, 사용하더라도 트랜스파일링이나 번들링이 필요하기 때문에 아직까지는 브라우저가 지원하는 ES6 모듈 기능보다는 Webpack 등의 모듈 번들러를 사용하는 것이 일반적입니다.


출처 : 자바스크립트 DEEP DIVE

0개의 댓글