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

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

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

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

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

Должен ли я определять переменные за пределами if-statement? Или первый вариант правильный? Или это не имеет большого значения?

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

Ответ 1

Начиная с официального выпуска спецификации ES2017 (2017-07-08), EcmaScript делает поддержку области истинного блока теперь с использованием ключевых слов let или const.


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

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

Пример головной боли:

var foo = 10;

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

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

Дальнейшее чтение: Область видимости и подъема JavaScript

Ответ 2

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

Ответ 4

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

Ответ 5

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

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