Подтвердить что ты не робот

Почему Jshint говорит "переменная, уже определенная" в этой инструкции if?

У меня есть этот код:

 if ( something is true ) {
        var someVar = true;
    } else {
       var someVar = false;
    }

JsHint говорит, что "someVar уже определен" в части инструкции else. Почему это и как его исправить?

Спасибо

4b9b3361

Ответ 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.)