You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
이 코드의 목적은 1, 2, ... , 5를 하나씩 일초마다 출력하는 것이지만, 실제로 코드를 돌리면 일초마다 한번씩 6만 다섯 번 출력된다.
timeout 함수 콜백은 반복문이 끝나고서야 작동하는데, 그 시점의 i값이 6이기 때문이다.
그러면 원래 의도대로 작동하도록 하려면 어떻게 바꿔야 할까?
반복문 안 총 다섯개의 함수들은 반복마다 따로 정의됐음에도 불구하고 모두 같은 글로벌 스코프를 공유해 단 하나의 i에 대한 참조를 공유하게 된다. 따라서 반복마다 각각의 i 복제본을 '잡아'두는 것이 필요하다.
그러니까 필요한 것은 더 많은 닫힌 스코프다. 즉 반복마다 하나의 새로운 닫힌 스코프가 필요하다.
// 의도대로 동작하게 하기 1: IIFE 이용하기for(vari=1;i<=5;i++){(function(){varj=i;setTimeout(functiontimer(){console.log(j);},j*1000);})();}// 의도대로 동작하게 하기 2: IIFE를 이용하는 또 다른 버전for(vari=1;i<=5;i++){(function(j){setTimeout(functiontimer(){console.log(j);},j*1000);})(i);}// 의도대로 동작하게 하기 3: var 대신 let 사용하기for(vari=1;i<=5;i++){letj=i;// 키워드 let은 본질적으로 하나의 블록을 닫을 수 있는 스코프로 바꾼다setTimeout(functiontimer(){console.log(j);},j*1000);}// 의도대로 동작하게 하기 4: var 대신 let 사용하기// let 선언문이 for 반복문 안에서 사용되면,// let으로 선언된 변수는 한번만 선언되는 것이 아니라 반복할 때마다 선언된다for(leti=1;i<=5;i++){setTimeout(functiontimer(){console.log(i);},i*1000);}
공개 API 객체에 대한 내부 참조를 모듈 인스턴스 내부에 유지하면, 모듈 인스턴스를 내부에서부터 메서드와 속성을 추가 또는 삭제하거나 값을 변경하는 식으로 수정할 수 있다.
미래의 모듈
모듈 시스템을 불러올 때 ES6는 파일을 개별 모듈로 처리한다.
함수 기반 모듈은 런타임 전까지 해석되지 않는다. 즉 실제로 모듈의 API를 런타임에 수정할 수 있다는 말이다.
반면, ES6 모듈 API는 정적이다. 따라서 컴파일러는 컴파일레이션 중에 불러온 모듈의 API 멤버 참조가 실제로 존재하는지 확인할 수 있다. API 참조가 존재하지 않으면, 컴파일러는 컴파일 시 초기 오류를 발생시킨다.
키워드 import는 모듈 API에서 하나 이상의 멤버를 불러와 특정 변수에 묶어 현재 스코프에 저장한다.
키워드 export는 확인자를 현재 모듈의 공개 API로 내보낸다.
정리
클로저는 함수를 렉시컬 스코프 밖에서 호출해도 함수는 자신의 렉시컬 스코프를 기억하고 접근할 수 있는 특성을 의미한다.
느낀점
토요일 밤에 이번 스터디 내용을 한번 읽어보려고 책을 봤더니 '타입과 문법, 스코프와 클로저'의 마지막 단원이었다! 이 책을 산지는 꽤 됐지만, 그때마다 궁금한 부분 위주로 찾아봤을 뿐 앞에서부터 차례대로 읽은 적은 없었는데, 대개 그렇겠지만 이 책도 순서대로 읽어야 이해하기 좋은.. 그런 책이었다.
(몇 번 미뤘지만) 일주일에 한번씩 한 챕터를 정리하는 방식의 장점은 어떻게든 일주일에 한 챕터를 훑게 된다는 것, 단점은 해치우다시피 하게 될 때가 많다는 것이다. 일을 하면서 주말을 할애해서 뭔가를 꾸준히 한다는 것 자체가 이미 부담되는 일이기에, 내용을 일일히 살펴보고 다 이해하려고 하기 보다는, 뭐가 되든 안되든 그냥 읽고 쓰고 마무리하는 것에 중점을 뒀다. 지금 내 지식에 나있는 구멍의 정도가 자갈밭과 같다면, 책을 빠르게 완독하는 과정을 반복하여 아주 고운 모래사장이 되도록 해보려고 한다.