Как правильно проверить, существует ли глобальная переменная?

JSLint не передает это как допустимый код:

/* global someVar: false */
if (typeof someVar === "undefined") {
    var someVar = "hi!";
}

Как правильно?

8 ответов


/*global window */

if (window.someVar === undefined) {
    window.someVar = 123456;
}

if (!window.hasOwnProperty('someVar')) {
    window.someVar = 123456;
}

/**
 * @param {string} nameOfVariable
 */
function globalExists(nameOfVariable) {
    return nameOfVariable in window
}

не имеет значения, создали ли вы глобальную переменную с помощью var foo или window.foo-переменные, созданные с помощью var в глобальном контексте, записываются в окно.


Если вы хотите назначить глобальную переменную, только если она еще не существует, попробуйте:

window.someVar = window.someVar || 'hi';

или

window['someVar'] = window['someVar'] || 'hi';

Я думаю, что это на самом деле проблема с JSLint. Он выдаст следующую ошибку:

неожиданный 'typeof'. Сравнивать напрямую с "неопределенным".

Я считаю, что это плохой совет. В JavaScript undefined глобальная переменная, которая, как правило, не определен. Но некоторые браузеры позволяют скриптам изменять его, например:window.undefined = 'defined'. Если это так, сравнивая непосредственно с undefined может привести к неожиданным результатам. К счастью, текущий ECMA 5 совместимый браузеры не позволяют назначатьundefined (и выдаст исключение в строгом режиме).

предпочитаю typeof someVar === "undefined", как вы разместили, или someVar in window как Susei предложил.


попробовать

variableName in window

или

typeof window[variableName] != 'undefined'

или

window[variableName] !== undefined

или

window.hasOwnProperty(variableName)

if (typeof someVar === "undefined") {
    var someVar = "hi!";
}

проверит, если someVar (локальный или глобальный) не определено.

если вы хотите проверить глобальную переменную, вы можете использовать

if(window['someVar'] === undefined) {
    ...
}

предположим, что это в браузере :)


bfavaretto неверно.

установка глобального undefined в значение не изменит тесты объектов против undefined. Попробуйте это в ваших любимых браузерах JavaScript консоли:

var udef; var idef = 42;
alert(udef === undefined); // Alerts "true".
alert(idef === undefined); // Alerts "false".
window.undefined = 'defined';
alert(udef === undefined); // Alerts "true".
alert(idef === undefined); // Alerts "false".

это просто связано с тем, что JavaScript игнорирует все и любые значения, которые пытались установить в неопределенной переменной.

window.undefined = 'defined';
alert(window.undefined); // Alerts "undefined".

Это был бы простой способ выполнить проверку .

но эта проверка провалится, если variableName объявляется и назначается с boolean value: false

if(window.variableName){

}