변수는 자신이 선언된 위치에서 생성되고 소멸한다. 전역 변수의 생명 주기는 애플리케이션의 생명 주기와 같다. 하지만 함수 내부에서 선언된 지역 변수는 함수가 호출되면 생성되고 함수가 종료하면 소멸한다.
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
var x = 'local'
}
foo();
console.log(x); // global
foo() 함수 내부에서 x의 출력값이 왜 undefined가 될까? 이는 호이스팅과 관련이 있는 것이 분명해 보인다. 이 정도면 정말 호이스팅을 자바스크립트 내부에서 가장 중요한 기능이라고 할 수 있을 것으로 보인다. 호이스팅은 스코프를 단위로 동작한다.
지역변수의 호이스팅은 선언이 되어 있다면 undefined 가 먼저 할당된다. 지역변수와 비슷한 성격을 가진다. 바로 다음줄에 local 이 선언, 할당이 되어있기 때문에 변수 호이스팅이 발생하는 것이다.
var x -> undefined -> local(오류는 발생하지 않는다)
(function () {
var foo = 10;
// ...
} ());
console.log(foo); // Reference Error: foo is not defined
var MYAPP = {};
MYAPP.person = {
name: 'Lee',
address: 'Seoul'
};
console.log(MYAPP.person.name); // Lee
캡슐화는 객체의 상태를 나타내는 프로퍼티와 매서드를 하나로 묶는 것을 의미한다.
객체의 특정 프로퍼티나 매서드를 감출 목적으로 사용하기도 하는데 이를 정보 은닉이라고 한다.
자바스크립트는 C처럼 클래스 public, private등 접근 제한자를 제공하지 않는다. 모듈패턴은 정보 은닉을 구현하기 위해 사용한다.
public 처럼 사용하고 싶으면 return 객체로 묶어주면 된다.
var Counter = (function () {
var num = 0; // private 역할...외부에서 선언이 불가능하다
return {
increase() {
return ++num; // public 역할
},
decrease() {
return --num; //public 역할
}
};
}());
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