Объяснение поведения JavaScript относительно объявления var - PullRequest
0 голосов
/ 01 апреля 2012

У меня есть следующий код:

"use strict";

function isDefined(variable)
{
    return (typeof (window[variable]) === "undefined") ? false : true;
} 

try
{
    isDefined(isTrue);
}
catch (ex)
{
    var isTrue = false;
}

isTrue = true;

Может кто-нибудь объяснить мне, почему, когда я удаляю ключевое слово 'var', я получаю исключение, но когда оно там, оно обрабатывается как неопределенное?

1 Ответ

3 голосов
/ 01 апреля 2012

При работе в строгом режиме вы не можете получить доступ к переменным, которые ранее не объявлялись.Таким образом, 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...