const WS = ["일", "월", "화", "수", "목", "금", "토"];
//Before
let idx = 0;
function week(params) {
if (idx >= WS.length) {
idx = 0;
}
return WS[idx++];
}
console.log(week()); //월
console.log(week()); //화
console.log(week()); //수
console.log("---------");
전역에 단순히 idx변수를 값을 저장하는 용도로 선언할 필요가 없다 .
따라서 변수선언을 가까히 할수있고(=함수 내부에) , 부수효과(side Effect)를 발생시키지 않음(=외부에서 수정못함)
let ih2 = (function newWeek() {
let idx = 0;
//함수 내부에 선언해도 참조되고 있기 때문에 초기화가 안된다.
return () =>{
if (idx >= WS.length) idx = 0;
return WS[idx++]};
})();
console.log(ih2()); //월
console.log(ih2()); //화
console.log(ih2()); //수
WS[idx++]
의 상위 scope에 위치한idx
변수를 외부환경참조(outer invironment reference)로 값을 기억하고 있기때문에idx
값을 유지할수 있다.