변수의 생명 주기는 메모리 공간이 확보된 시점부터 메모리 공간이 해제되어 메모리 풀에 반환 되는 시점 까지 이다.
(function(){
var foo = 10;
// ...
}());
console.log(foo); // ReferenceError: foo is not defined
모든 코드를 즉시 실행 함수로 감싸면 모든 변수는 즉시 실행 함수의 지역 변수가 된다.
var MYAPP = {}; // 전역 네임스페이스 객체
MYAPP.name = 'Lee';
console.log(MYAPP.name); // Lee
전역 변수처럼 사용하고 싶은 변수를 프로퍼티로 추가하는 방법 → 전역 네임스페이스 객체가 생성되어 이 자체가 전역 변수에 할당되므로 좋은 방법 이라고 얘기 못함전역 변수의 억제
+ 캡슐화
가능 javascript에는 public, private, protected가 존재하지 않는데 해당 방법으로 이와 비슷한 기능을 구현하는 것이 가능 var Counter = (function() {
//private 변수
var num = 0;
//외부로 공개할 데이터나 메서드를 프로퍼티로 추가한 객체를 반환한다.
return {
increase(){
return ++num;
},
decrease(){
return --num;
}
}());
console.log(Counter.num); //undefined
console.log(Counter.increase()); //1
console.log(Counter.increase()); //2
console.log(Counter.decrease()); //1
Counter의 스코프 밖에서 바라볼 때는 어떤 객체도 직접 접근 불가 즉시 실행 함수는 한 번만 실행되므로 Counter이 호출될 때마다 num의 값이 0으로 계속 초기화되지 않음 즉시 실행 함수가 반환한 closure ( increase, decrease) 는 Counter 변수에 할당됨 선언 → 초기화
단계를 거친다. 선언 : 자바스크립트 엔진에 변수의 존재를 알린다.
초기화 : 변수를 처음에 undefined로 초기화를 한다.
자바스크립트에서 변수는 호이스팅
이라는 특징이 존재한다.
console.log(kmj) // output: undefined
var kmj
변수 선언이 어디에 있든 상관없이 다른 코드보다 먼저 실행되는 것을 말한다.
즉 런타임 때 실행 되는 것이 아닌 그 이전 단계에서 먼저 실행 된다.
스코프
각 변수는 선언된 위치에 따라 변수의 유효범위가 정해진다.
전역에 선언된 변수 → 전역 스코프
지역에 선언된 변수 → 지역 스코프
var의 문제점
변수 중복 선언이 가능하다.
var i = 0;
for(var i =0; i < 5; i++)
console.log(i); // 0 1 2 3 4
console.log(i); // 4
→ for 문에서 var 변수에 의해 i의 값이 갱신 되어 값이 재 할당 됨을 볼 수 있다.
변수 선언문 이전에 변수를 참조하면 undefined를 반환한다. ( 호이스팅에 의해 )
함수 외부에서 선언된 변수는 모두 전역 변수로 된다.
→ let, const는 해당 문제점을 해결한다.
let
변수 중복 선언을 금지한다.
변수 값이 재할당 되어 생기는 부작용 억제
모든 코드 블록을 지역 스코프로 인정하는 블록 레벨 스코프를 따른다.
(if, for, while, try/catch)
let a = 1
if (true) {
let a = 5
}
console.log(a) // output: 1
var로 선언을 했으면 마지막 결과에서 5가 나오지만
let으로 선언을 했기 때문에 1이 나온다.
변수 호이스팅이 발생하지 않는 것처럼 작동
**let 키워드로 선언한 변수는 `선언` 단계와 `초기화` 단계가 분리되어 진행**
⇒ var에서는 선언하자마자 초기화 단계가 함께 진행
⇒ let에서는 변수 초기화 단계 이전에 변수 접근 시 참조 에러 발생
```jsx
/// 런타임 이전에 선언 단계 실행
// 아직 변수 초기화는 되지 않음
console.log(foo); // ReferenceError
let foo; // 변수 선언문에서 초기화 단계 실행
console.log(foo);
foo = 1; // 할당문에서 할당 단계 실행
console.log(foo); // 1
```
하지만 다음 예제를 보면 let도 함수 호이스팅을 한다는 것을 알 수 있다.
let foo = 1;
{
console.log(foo); // reference error
let foo = 2;
}
→ 위에 전역으로 선언된 let foo = 1; 이 있으므로 console.log(foo)에서 1이 출력해야 할 것 같지만 let foo =2; 에서 호이스팅 됐기 때문에 참조 에러 발생
const
const 키워드로 선언한 변수는 반드시 선언과 동시에 초기화
const foo = 1;
재할당 금지
let foo = 1;
foo = 2;
const bar = 1;
bar = 2; // TypeError: Assignment to constant variable.
let
은 재할당이 가능하고 const
는 재할당이 불가능