Определение переменных JavaScript внутри операторов if

правильно ли определять переменные JavaScript внутри if-операторов?

if(a==1){
    var b = 1;
} else {
    var b = 0;
}

Я знаю, что приведенный выше код будет работать, однако WebMatrix выделяет переменные.

должен ли я определять переменные вне оператора if? Или первый вариант правильный? Или это не имеет значения?

var b = '';
if(a==1){
    b = 1;
} else {
    b = 0;
}

5 ответов


по состоянию на официальный релиз ES2017 spec (2017-07-08), EcmaScript тут поддержка true block scope теперь с помощью let или const ключевые слова.


поскольку ECMAscript не имеет блок рамки но объем функция, его очень хорошая идея объявить любую переменную в верхней части ваших контекстов функций.

хотя ты можете сделайте объявления переменной и функции в любой момент в пределах a контекст функции, это очень запутанно и приносит некоторые странные головные боли, Если вы не полностью осознаете последствия.

головная боль пример:

var foo = 10;

function myfunc() {
    if (foo > 0) {
        var foo = 0;
        alert('foo was greater than 0');
    } else {
        alert('wut?');
    }
}

угадайте, что, мы получаем ' wut?'тревога при вызове myfunc здесь. Это потому, что интерпретатор ECMAscript будет любой var заявления и объявление функции в верхней части контекста автоматически. В основном, foo инициализируется к undefined перед первым if statement.

читайте далее: JavaScript область и подъем


размещение var внутри оператора if не противоречит "правилам" языка, но это означает, что из-за подъема var этот var будет определен независимо от того, выполняется ли условие оператора if.


обратите внимание, что ECMAscript 6 поддерживает переменные уровня блока, используя ключевое слово "let", а не "var". В то время как переменные, объявленные с помощью "var", поднимаются в область функций независимо от того, где они объявлены, те, которые определены с помощью "let", ограничиваются только заключительным блоком.


поскольку переменные JavaScript имеют область на уровне функций, ваш первый пример эффективно объявляет вашу переменную, что может объяснить, почему она выделяется.

в старых версиях Firefox его строгий режим JavaScript использовался для предупреждения об этой редекларации, однако один из его разработчиков пожаловался, что он стеснил его стиль, поэтому предупреждение было отключено. (Текущие версии Firefox поддерживают синтаксис объявления переменных уровня блока.)


функции four on какова область переменных в JavaScript?

С 2012 года в JavaScript нет области уровня блока. Таким образом, ваша первая версия в порядке: переменные определены в области вне if блок.