본문 바로가기
JavaScript

[JavaScript] Global variables (전역 변수)

by 배잼 2022. 2. 6.

모던 자바스크립트 Deep Dive 14장을 읽으며 정리한다.

내게는 좋지 않은 버릇이 하나 있다. 코딩하다 함수에서 값을 다른 함수로 전달하는 과정이 어려우면 가끔 전역 변수를 선언하고 그걸로 문제를 처리한다. 과연 좋은 걸까? 전역 변수의 문제점은 다음과 같다.

  • 암묵적 결합(implicit coupling) : 모든 코드가 전역 변수를 참조하고 변경 가능
  • 긴 생명 주기
  • 스코프 체인 상에서 종점에 존재 : 검색 속도가 가장 느리다
  • 네임스페이스 오염 : 자바스크립트는 파일이 분리되어 있어도 하나의 전역 스코프를 공유한다.

그렇다면 어떤 방식으로 전역 변수 사용을 억제할 수 있을까? 변수의 스코프는 좁을수록 좋다. 나처럼 무분별한 전역 변수 사용은 자제해야 한다.

  • 즉시 실행 함수 : 모든 코드를 즉시 실행 함수로 감싸면 모든 변수는 즉시 실행 함수의 변수가 된다. → 플러그인, 라이브러리 등에 사용한다.
  • 네임스페이스 객체
// 전역 네임스페이스 객체를 생성
var MYAPP = {};

MYAPP.Child = function() { console.log('Child'); };

MYAPP.variable = 1;

//객체 컨테이너
MYAPP.modules = {};

MYAPP.modules.module1 = {}; //네임스페이스 객체에 또 다른 객체를 property로 추가
MYAPP.modules.module1.data = {a: 1}; 

console.log(MYAPP.modules.module1.data.a);    // 1 출력
MYAPP.Child();                                // Child 출력

네임스페이스를 분리해서 식별자 충돌을 방지할 수 있다.

  • 모듈 패턴
    • 캡슐화(encapsualtion) : object의 state를 나타내는 property와 property를 참조하고 조작할 수 있는 behaivor인 method를 하나로 묶는 것.
    • 정보 은닉(information hiding) : 객체의 특정 property나 method를 감추는 것
    • JS는 public, private, protected 등의 접근 제한자를 제공하지 않는다.
    • closer? (추후 공부할 예정)
    • 즉시 실행 함수로 객체를 반환, 이때 반환되는 객체의 property는 public member다. 노출하고 싶지 않다면 private member이다.
    → 자료구조 수업을 들으며 C++로 작성해 봤던 게 모듈 패턴이 아니었을까.

댓글