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?
/*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
}
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.
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';
essayer
variableName in window
ou
typeof window[variableName] != 'undefined'
ou
window[variableName] !== undefined
ou
window.hasOwnProperty(variableName)
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.
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 :)
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".
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){
}