세 번째와 마지막 루프 반복 이후 모든 일이 발생하면 메모리에 그림 2-7과 같은 결과를 얻게 된다.
▲ 그림 2-7
타이머 함수가 타이머에 의해 호출될 때 각각 별도의 환경 객체를 사용하고 각각 자체 counter 복사본을 사용하기 때문에 동일한 환경 객체와 변수를 모두가 공유하는 var의 값인 4, 4, 4 대신 1, 2, 3이 표시된다.
요컨대, 루프의 블록 스코프 메커니즘은 ES5 솔루션의 익명 함수가 수행한 작업을 정확히 수행했다. 각 타이머 함수에 바인딩의 자체 복사본으로 감쌀 수 있는 다른 환경 객체를 제공했다(let 솔루션의 counter, ES5의 값 해결책). 그러나 별도의 함수와 함수 호출없이 더 효율적으로 수행했다.
물론 때로는 이전 동작을 원한다. 이 경우 루프 밖에 변수를 선언하자(이것은 물론 var가 한 일이다).
루프에 대해 방금 배운 동작의 유일한 부분은 하나의 환경 객체에서 다음 객체로 바인딩의 값을 복사하고 for의 초기화 부분에서 생성된 변수를 추적하는 부분이다. 그러나 블록이 자체 환경 객체를 얻는다는 사실은 for 루프에만 국한되지 않으며, 무엇보다도 while과 do-while 루프가 자체 환경 객체를 얻는 블록의 이점을 얻을 수 있음을 의미한다. 방법을 살펴보겠다.