setTimeout()의 콜백 함수(굵은 글씨 부분)는 외부 변수 i에 접근하는 클로저입니다. 이때 1000 * (i + 1)과 console.log(number[i])가 같은 시점에 실행된다고 착각하는 경우가 많습니다. 그러나 setTimeout() 인수인 1000 * (i + 1)은 반복문을 돌 때 실행되고, 클로저는 지정한 시간 뒤에 호출됩니다. 그런데 반복문은 매우 빠른 속도로 돌아서 클로저가 실행될 때는 이미 i가 4(numbers.length도 4)가 되어 있습니다.
• i가 0일 때 setTimeout(콜백, 1000) 실행
• i가 1일 때 setTimeout(콜백, 2000) 실행
• i가 2일 때 setTimeout(콜백, 3000) 실행
• i가 3일 때 setTimeout(콜백, 4000) 실행
• i가 4일 때 4 < numbers.length는 false이므로 반복문이 끝남
• 1초 후 콜백 함수 실행(i는 4)
• 2초 후 콜백 함수 실행(i는 4)
• 3초 후 콜백 함수 실행(i는 4)
• 4초 후 콜백 함수 실행(i는 4)