Проблема с объявлением в заголовке цикла var
заключается в том, что это обманчиво. Это выглядит как вы объявляя переменную, сфера ограничена for
цикла, когда он на самом деле существует везде в пределах функции - в том числе перед тем заявление:
var i = 1;
function foo() {
console.log(i); // 'undefined'
for (var i=1; i<100; ++i) {
}
}
Даже несмотря на то, console.log
вызов происходит до того объявление локального i
, оно все еще доступно для него, потому что оно находится внутри одной и той же функции. Таким образом, локальный i
, которому еще не присвоено какое-либо значение, является то, что передается в log
. Это может быть удивительно; это, безусловно, не очевидно для всех, кто не знаком с правилами Javascript.
Начиная с ECMAScript 2015, существует лучший способ объявить переменные: let
. Переменные, объявленные с помощью let
, являются локальными для блока, содержащего их, а не для всей функции. Так эта версия кода выше напечатает 1
по назначению:
let i=1; // could use var here; no practical difference at outermost scope
function foo() {
console.log(i); // 1
for (let i=1; i<100; ++i) {
}
}
Так лучшая практика в современной Javascript должен объявлять переменные с let
вместо var
. Однако, если вы застряли в реализации до ECMAScript 2015, немного запутать объявление всех переменных в верхней части функции, а не ждать до первого использования.
Возможный дубликат [переменные JavaScript объявляются вне или внутри цикла?] (Http://stackoverflow.com/questions/3684923/javascript-variables-declare-outside-or-inside-loop) –