Предпочтительный подход в 2016 году, чтобы объявить переменную в головке петли, используя let
:
for (let i = 0; i < max; i++) { }
^^^
Существует, вероятно, минимальное различие в производительности между этим и другими подходами, но существуют значительные преимущества в терминах надежность и ясность вашего кода.
Во-первых, с let
, i
является локальной по отношению к for
конструкции, поэтому он не может «утечки», или модифицировать какой-либо другой i
во внешней области видимости.
Во-вторых, и, что еще важнее, для каждой итерации цикла создается новая версия i
. С технической точки зрения, вы получаете свежую привязку для каждой итерации, если вы разрешите объявление переменной "(см. this excellent article). Это решает старую проблему замыканий, созданных внутри цикла for, с использованием конечного значения i
.Теперь мы можем просто написать
for (let i = 0; i < 10; i++) {
setTimeout(() => alert(i), i * 1000);
}
вместо того, чтобы сделать какой-то неуклюжий обходным такой, как
for (var i = 0; i < 10; i++) {
(function(i) {
setTimeout(() => alert(i), i * 1000);
}(i));
}
, который был темой бесчисленных вопросов здесь, на SO, и который многие из вас впустую слишком много мозговых циклов обучения.
В этом ответе было бы очень полезно включить, что «let' работает в этом контексте. –