14.1 변수의 생명 주기
// 지역 변수의 생명 주기
// 1. 함수 내부에서 선언된 지역 변수는 함수가 호출되면 생성되고 함수가 종료하면 소멸한다
// 2. 즉 지역 변수의 생명주기는 함수의 생명 주기와 일치한다.
function foo() {
var x = 'local'
console.log(x) // local
return x
}
foo()
console.log(x) // ReferenceError
// 전역 변수의 생명 주기
// 1. 전역 코드는 명시적인 호출 없이 실행된다. 특별한 진입점이 없고 코드가 로드되자마자 곧바로 해석되고 실행, 마지막 문이 실행되어 더 이상 실행할 문이 없을때 종료
// 2. var 키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 된다. 전역 변수의 생명 주기는 전역 객체의 생명 주기와 일치한다
14.2 전역 변수의 문제점
전역 변수를 선언한 의도는 전역, 즉 코드 어디서든 참조하고 할당할 수 있는 변수를 사용하겠다는 것이며, 이는 모든 코드가 전역 변수를 참조하고 변경할 수 있는 암묵적 결합을 허용하는 것이다.
즉 변수의 스코프가 크면 클수록 코드의 가독성이 나빠지며 위험성도 높아진다
14.3 전역 변수의 사용을 억제하는 방법
// 즉시 실행 함수
// 모든 코드를 즉시 실행 함수로 감싸면 모든 변수는 즉시 실행 함수의 지역 변수가 된다.
// 이 방법을 사용하면 전역 변수를 생성하지 않으므로 라이브러리 등에 자주 사용됨
(function () {
var foo = 10 // 즉시 실행 함수의 지역 변수
}())
/*===================================*/
// 네임스페이스 객체
// 전역에 네임스페이스 역할을 담당할 객체를 생성하고 전역 변수처럼 사용하고 싶은 변수를 프로퍼티로 추가하는 방법
var MYAPP = {} // 전역 스페이스 객체
MYAPP.person = {
name: 'Lee',
address: 'Seoul'
}
/*===================================*/
// 모듈 패턴
// 클래스를 모방해서 관련이 있는 변수와 함수를 모아 즉시 실행 함수로 감싸 하나의 모듈로 만든다.
// 클로저를 기반으로 동작하며, 전역 변수의 억제는 물론 캡슐화까지 구현할 수 있다.
var Counter = (function () {
// private 변수
var num = 0
// 외부로 공개할 데이터나 메서드를 프로퍼티로 추가한 객체를 반환한다.
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
/*===================================*/
// ES6 모듈
// ES6 모듈은 파일 자체의 독자적인 모듈 스코프를 제공하므로 더는 전역 변수를 사용할 수 없다.
// 즉 모듈 내에서 var 키워드로 선언한 변수는 더는 전역 변수가 아닌 window 객체의 프로퍼티도 아니다.