При работе в строгом режиме вы не можете получить доступ к переменным, которые ранее не объявлялись.Таким образом, isTrue
должен быть объявлен, прежде чем вы сможете получить к нему доступ.Таким образом, если вы удалите var
перед ним и он не будет нигде объявлен, это будет ошибкой.
Цитирование со страницы MDN в строгом режиме :
Во-первых, строгий режим делает невозможным случайное создание глобальных переменных.В обычном JavaScript неправильный ввод переменной в присваивании создает новое свойство для глобального объекта и продолжает «работать» (хотя в будущем возможен сбой: вероятно, в современном JavaScript).Задания, которые случайно создали бы глобальные переменные, вместо этого выдают в строгом режиме:
Часть вашего вопроса о undefined
немного сложнее.Из-за подъема переменной, когда объявление переменной поднимается компилятором в начало области, в которой он объявлен, ваш код с оператором var
эквивалентен следующему:
var isTrue;
try
{
isDefined(isTrue);
}
catch (ex)
{
isTrue = false;
}
isTrue = true;
Таким образом, когда вы вызываетеisDefined(isTrue)
, значение isTrue
равно undefined
.Он был объявлен, но не инициализирован, поэтому его значение равно undefined
.Если у вас нет оператора var
, любая ссылка на isTrue
в строгом режиме является ошибкой, поскольку она еще не была объявлена.
Если вы просто хотите узнать, имеет ли переменнаязначение, но вы можете просто сделать это:
if (typeof isTrue != "undefined") {
// whatever code here when it is defined
}
Или, если вы просто хотите убедиться, что оно имеет значение, если оно еще не было инициализировано, вы можете сделать это:
if (typeof isTrue == "undefined") {
var isTrue = false;
}