14장 전역 변수의 문제점

14.1 변수의 생명 주기

14.1.1 지역 변수의 생명 주기(14-01)

  • 지역 변수의 생명 주기는 함수의 생명 주기와 일치
function foo() {
  var x = 'local';
  console.log(x); // local
  return x;
}

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

14-02

  • 1의 정답은? undefiend
var x = 'global';

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

foo();
console.log(x); // global

14.1.2 전역 변수의 생명 주기

  • var 키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 됨

  • 전역 변수의 생명 주기가 전역 객체의 생명 주기와 일치한다는 것을 말함

14.2 전역 변수의 문제점(14-03)

  • 전역 변수의 문제점 암묵적 결합(어디서든) 긴 생명 주기(아래 예시) 스코프 체인 상에서 종점에 존재(종점이라 검색이 느림) 네임스페이스 오염(파일이 분리되어도 하나의 전역 스코프를 공유)
var x = 1;

// ...

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

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

14.3.1 즉시 실행 함수(14-04)

  • 전역 변수 사용 억제 방법 즉시 실행 함수(단 한번만 호출)
(function () {
  var foo = 10; // 즉시 실행 함수의 지역 변수
  // ...
}());

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

14.3.2 네임스페이스 객체(14-05)

  • 전역 변수 사용 억제 방법 네임스페이스 객체(추천 x)
var MYAPP = {}; // 전역 네임스페이스 객체

MYAPP.name = 'Lee';

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

14-06

  • 이름 충돌은 방지 하겠지만 객체 자체는 전역 변수에 할당
var MYAPP = {}; // 전역 네임스페이스 객체

MYAPP.person = {
  name: 'Lee',
  address: 'Seoul'
};

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

14.3.3 모듈 패턴(14-07)

  • 전역 변수 사용 억제 방법 모듈 패턴(클로저 기반, 캡슐화!)
var Counter = (function () {
  // private 변수
  var num = 0;

  // public 외부로 공개할 데이터나 메서드를 프로퍼티로 추가한 객체를 반환한다.
  return {
    increase() {
      return ++num;
    },
    decrease() {
      return --num;
    }
  };
}());

// private 변수는 외부로 노출되지 않는다.
console.log(Counter.num); // undefined

console.log(Counter.increase()); // 1
console.log(Counter.increase()); // 2
console.log(Counter.decrease()); // 1
console.log(Counter.decrease()); // 0

14.3.4 ES6 모듈(14-08)

  • 전역 변수 사용 억제 방법 ES6 모듈(확장자 mjs를 권장)

  • 이를 사용하면 전역 변수 사용 못함. ES6 모듈은 파일 자체의 독자적인 모듈 스코프를 제공(원래 1개의 스코프를 사용했음!!)

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

댓글남기기