변수의 생명 주기는 메모리 공간이 확보 allocate된 시점부터 메모리 공간이 해체 release되어 가용 메모리 풀 memory pool에 반환되는 시점
지역 변수의 스코프가 함수 종료 이후에도 참조되고 있다면 스코프는 해체되지 않고 생존, 지역 변수는 함수가 생성한 스코프에 등록되므로 해당 경우에는 함수가 종료되더라도 지역 변수가 생존할 수 있음
호이스팅은 스코프 단위로 동작. 변수 선언이 스코프의 선두로 올려진 것처럼 동작하게 됨
function foo() {
var x = "local";
console.log(x); // local
return x;
}
foo();
console.log(x); // ReferenceError: x is not defined
var x = "global";
function foo() {
console.log(x); // undefined 해당 시점에 지역 변수 x는 선언되었고 undefined로 초기화
var x = "local";
}
foo();
console.log(x); // global
전역 변수의 생명 주기
var 키워드로 선언한 전역 변수의 생명 주기는 전역 객체의 생명 주기와 일치
전역 객체: 코드가 실행되기 이전 단계에 자바스크립트 엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체
전역 변수의 문제점
암묵적 결합 implicit coupling: 변수 유효 범위가 클수록 코드의 가독성은 나빠지고 의도치 않게 상태가 변경 가능
긴 생명 주기
스코프 체인 상에서 종점에 존재, 전역 변수의 검색 속도가 가장 느림
네임스페이스 오염
전역 변수의 사용을 억제하는 방법
즉시 실행 함수
즉시 실행 함수로 감싸면 해당 변수는 즉시 실행 함수의 지역 변수가 됨
(function () {
var foo = 10;
})();
console.log(foo); // ReferenceError: foo is not defined
네임스페이스 객체
전역에 네임스페이스 namespace 역할을 담당할 객체를 생성하고 전역 변수처럼 사용하고 싶은 변수를 프로퍼티로 추가하는 방법
네임스페이스 객체에 또 다른 네임 스페이스 객체를 추가하는 방법으로 계층적으로 구성 가능
네임스페이스 자체가 전역 변수에 할당되므로 그다지 유용하지 않음
var MYAPP = {}; // 전역 네임스페이스 객체
MYAPP.person = {
name: "Jin",
address: "Seoul",
};
console.log(MYAPP.person.name); // Jin
모듈 패턴
모듈 패턴은 클래스를 모방해서 관련이 있는 변수와 함수를 모아 즉시 실행 함수로 감사 하나의 모듈을 만듦
모듈 패턴은 자바스크립트의 강력한 기능인 클로저를 기반으로 동작
전역 변수의 억제와 캡슐화까지 구현 가능
캡슐화 encapsulation는 객체의 상태 state를 나타내는 프로퍼티와 프로퍼티를 참조하고 도작할 수 있는 동작 behavior인 메서드를 하나로 묶는 것, 객체의 특정 프로퍼티나 메서드를 감출 목적으로 사용되기도 하는데 이를 정보 은닉 information hiding 이라고 함
자바스크립트는 public, private, protected 등의 접근 제한자를 제공하지 않지만, 타입스크립트는 제공함