전역변수의 무분별한 사용은 위험, 전역변수를 반드시 사용해야 할 이유를 찾지 못한다면 지역변수를 사용
변수는 선언에 의해 생성되고 할당을 통해 값을 갖는다. 그리고 언젠간 소멸한다.
function foo(){
var x = "local" // 변수 x 생성, 값 할당
console.log(x)
return x // 변수 x 소멸
}
foo()
console.log(x) // ReferenceError: x is not defined
※ 호이스팅은 스코프 단위로 동작한다.
var x = 'global';
function foo() {
console.log(x); // undefined 변수선언(var x)이 스코프의 선두로 끌어올려진 것
var x = 'local';
}
foo();
console.log(x); // global
- 암묵적 결합
- 모든 코드가 전역변수를 참조하고 변경이 가능하여 가독성이 나빠지고 의도치않게 상태변경이 됨
- 긴 생명주기
- 메모리 리소스를 오랜기간 소비, 변수 이름 중복 가능성이 높다.
- 스코프체인 상에서 종점에 존재
- 변수를 검색할 때 가장 안쪽 스코프부터 마지막에 검색함. 즉, 검색속도가 느리다
- 네임스페이스 오염
- 파일이 분리되어도 하나의 전역 스코프를 공유하기 때문에 이름이 겹칠 가능성이 높다.
(function () {
var foo = 10; // 즉시 실행 함수의 지역 변수
// ...
}());
console.log(foo); // ReferenceError: foo is not defined
var MYAPP = {}; // 전역 네임스페이스 객체
MYAPP.person = {
name: 'Lee',
address: 'Seoul'
};
console.log(MYAPP.person.name); // Lee
캡슐화
- 객체의 상태를 나타내는 프로퍼티와 프로퍼티를 참조하고 조작하는 동작인 매서드를 하나로 묶는 것
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