{ }
)로 감싸진 구역)으로 만들어진 스코프{ }
)로 감싸진 구역)으로 만들어진 스코프if
, switch
, for
, while
은 각각 블록 스코프를 형성한다.var
, let
and const
ES6 이전에 쓰였던 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에 접근할 수 있다.