2.7.4 성능 영향
루프에서 블록 스코프가 작동하는 방식에 대해 생각하면 다음과 같이 생각할 수 있다. “잠깐, 루프에서 블록 변수를 사용하고 이를 보유하고 체인을 설정하고 (for 루프의 경우) 복사할 새 환경 객체를 만들어야 하고 어딘가에서 어딘가로 반복 바인딩 값을 복사해야 한다면 루프 속도가 느려지지 않을까?”
이에 대한 두 가지 답변이 있다.
1. 아마 상관하지 않을 것이다. 성급한 최적화는 성급하다는 것을 기억하자. 실제 성능 문제가 있어 해결해야 하는 경우에 걱정하자.
2. 그렇기도 하고 아니기도 하다. 자바스크립트 엔진이 차이를 최적화하지 않았고 차이를 최적화할 수 없는 경우(루프의 클로저 예 포함)가 있다면 확실히 더 많은 오버 헤드가 발생한다. 다른 경우에는 클로저를 생성하지 않거나 엔진이 클로저가 루프 반복 변수를 사용하지 않는다고 결정할 수 있다면 차이를 최적화할 수 있다. 최신 엔진은 많은 최적화를 수행한다. ES2015의 let이 새로워졌을 때 크롬의 V8 엔진은 var를 사용한 경우보다 루프 변수에 let을 사용하면 for 루프가 현저히 느려졌다. V8의 엔지니어가 이를 최적화하는 방법을 찾았기 때문에 (클로저가 생성되지 않는 경우 등) 속도 차이는 사라졌다.
루프에 실제 문제가 발생하고 변수의 별도 사본이 있는 것이 중요하지 않은 경우, 둘러싼 범위로 이동하자.
let n;
for (n = 0; n < aReallyReallyBigNumber; ++n) {
// ...
}