
{ })로 감싸진 구역)으로 만들어진 스코프{ })로 감싸진 구역)으로 만들어진 스코프if, switch, for, while은 각각 블록 스코프를 형성한다.var, let and constES6 이전에 쓰였던 var 키워드는 함수 스코프를 따르며 블록 스코프는 무시한다.
let과 const는 블록 스코프를 인지한다.
var가 아닌 let, const를 사용해야 하는 이유 : var는 재선언되어 오류를 발생시킬 여지가 있다. 또한 let, const는 블록 스코프를 가지므로 함수 스코프를 가지는 var보다 예측 가능하다.
// LET -----
for (let i = 0; i < 3; i++) {
console.log('current : ' + i);
}
console.log('last : ' + i);
// current : 0
// current : 1
// current : 2
// last : undefined (let으로 선언된 i는 for loop 밖에서 접근 불가)
// VAR -----
for (var j = 0; j < 3; j++) {
console.log('current : ' + j);
}
console.log('last : ' + j);
// current : 0
// current : 1
// current : 2
// last : 3 (var로 선언된 j는 블록 스코프를 따르지 않기 때문에 for loop 밖에서도 접근 가능)
function makeCounter() {
let count = 0;
return {
increase: () => {
count++;
},
getCount: () => count,
};
}
const counter = makeCounter();
counter.increase(); // (count의 값을 1 증가 시킴)
console.log(counter.getCount()); // 1 (count의 값을 리턴함)
console.log(count); // ReferenceError
// 변수 count는 makeCounter 함수 외부에서 접근할 수 없지만
// increase와 getCount 함수는 자신들의 lexical environment에 속한 변수 count에 접근할 수 있다.