web-dev-qa-db-fra.com

Quelle est la bonne façon de vérifier si une variable globale existe?

JSLint ne transmet pas cela comme un code valide:

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

Quelle est la bonne façon?

56
Ebrahim Byagowi
/*global window */

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

if (!window.hasOwnProperty('someVar')) {
    window.someVar = 123456;
}
77
bigoldbrute
/**
 * @param {string} nameOfVariable
 */
function globalExists(nameOfVariable) {
    return nameOfVariable in window
}

Peu importe que vous ayez créé une variable globale avec var foo ou window.foo - les variables créées avec var dans le contexte global sont écrites dans window.

13
gvlasov

Si vous souhaitez affecter une variable globale uniquement si elle n'existe pas déjà, essayez:

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

ou

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

essayer

variableName in window

ou

typeof window[variableName] != 'undefined'

ou

window[variableName] !== undefined

ou

window.hasOwnProperty(variableName)
8
gion_13

Je pense que c'est en fait un problème avec JSLint. Il émettra l'erreur suivante:

"Typeof" inattendu. Comparez directement avec "non défini".

Je pense que c'est un mauvais conseil. En JavaScript, undefined est une variable globale qui n'est généralement pas définie. Mais certains navigateurs permettent aux scripts de le modifier, comme ceci: window.undefined = 'defined'. Si tel est le cas, une comparaison directe avec undefined peut conduire à des résultats inattendus. Heureusement, les navigateurs compatibles ECMA 5 actuels n'autorisent pas les affectations à undefined (et lèveront une exception en mode strict).

Je préfère typeof someVar === "undefined", comme vous l'avez publié, ou someVar in window comme l'a suggéré Susei.

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

vérifiera si someVar (local ou global) n'est pas défini.

Si vous souhaitez rechercher une variable globale, vous pouvez utiliser

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

en supposant que ce soit dans un navigateur :)

5
Vatev

bfavaretto est incorrect.

La définition de l'indéfini global sur une valeur ne modifiera pas les tests des objets par rapport à l'indéfini. Essayez ceci dans la console JavaScript de votre navigateur préféré:

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".

Cela est simplement dû au fait que JavaScript ignore tout et que toutes les valeurs ont tenté d'être définies sur la variable non définie.

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

Ce serait un moyen simple d'effectuer la vérification.

Mais cette vérification échouerait si variableName est déclaré et est affecté avec le boolean value: false

if(window.variableName){

}
1
Prem Anand