Почему Jshint говорит "переменная, уже определенная" в этой инструкции if?
У меня есть этот код:
if ( something is true ) {
var someVar = true;
} else {
var someVar = false;
}
JsHint говорит, что "someVar уже определен" в части инструкции else. Почему это и как его исправить?
Спасибо
Ответы
Ответ 1
JS-переменные не имеют области блока, у них есть область "функции" (или иногда глобальная).
Объявление (но не назначение) "поднимается" вверху функции.
jshint предупреждает вас, что у вас есть два таких объявления - ваш код эквивалентен:
var someVar;
var someVar; // warning!
if (something) {
someVar = true;
} else {
someVar = false;
}
Ответ 2
Это связано с подъемом.
В javascript, независимо от того, где вы определяете новую переменную с помощью var
, она перемещает ее в начало функции, в которой вы находитесь. В вашем коде создается следующий выше блок if в верхней части функции:
var someVar;
var someVar;
Вот учебник для объяснения подъема:
http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript-hoisting-explained/
Ответ 3
Вы не должны размещать объявления var
в таких местах. Поместите объявление var
перед if
, а затем просто установите значение "someVar" в значение.
В самом деле, здесь вам не нужен оператор if
:
var someVar = !!(something);
сделает то же самое. (Двойное применение !
гарантирует, что "someVar" установлен либо на true
, либо на false
на основе "правдивости" something
.)