var
один не выполняет назначение. Он только указывает, что когда вы используете имя переменной во всей области действия, в которой встречается var
, вы говорите о локальной переменной, а не о глобальной (спорная по умолчанию). var
обнаруживается, когда функция анализируется и удерживается во всей этой области, поэтому то, куда вы ее поместили, не имеет значения:
var a= 0;
function foo() {
a= 1;
return a;
var a;
}
var b= foo();
alert('global a='+a+', local a='+b);
Результат global a= 0, local a= 1
: хотя оператор var
никогда не достигается в ходе выполнения foo()
, он по-прежнему эффективен для создания a
локальной переменной.
Таким образом, объявление var x
второй раз в той же области полностью избыточно. Однако иногда вы все равно можете это сделать, как правило, когда вы повторно используете имя локальной переменной для второго независимого использования в той же функции. Чаще всего:
for (var i= 0; i<onething.length; i++) {
...do some trivial loop...
}
for (var i= 0; i<anotherthing.length; i++) {
...do another trivial loop...
}
Хотя вы, конечно, можете опустить второй var
, и такие инструменты, как jslint
, потребуют от вас этого, на самом деле это не очень хорошая идея.
Представьте, что вы позже изменили или удалили первый цикл, чтобы он больше не объявлял i
равным var
. Теперь оставшийся второй цикл внезапно меняет значение с локальной на глобальную переменную. Если вы не замечаете при обновлении первого цикла, что второй цикл имеет скрытую зависимость от него (и вы вполне можете не заметить, что, учитывая то, как глаза скрывают шаблон for(...=0 ; ...<...; ...++)
в «о, это просто стандартный итератор») ), у вас есть тонкая и раздражающая проблема отладки.