JSLint übergibt dies nicht als gültigen Code:
/* global someVar: false */
if (typeof someVar === "undefined") {
var someVar = "hi!";
}
Was ist der richtige Weg?
/*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
}
Es spielt keine Rolle, ob Sie eine globale Variable mit var foo oder window.foo erstellt haben - Variablen, die mit var im globalen Kontext erstellt wurden, werden in window geschrieben.
Wenn Sie eine globale Variable nur zuweisen möchten, wenn sie noch nicht vorhanden ist, versuchen Sie Folgendes:
window.someVar = window.someVar || 'hi';
oder
window['someVar'] = window['someVar'] || 'hi';
versuchen
variableName in window
oder
typeof window[variableName] != 'undefined'
oder
window[variableName] !== undefined
oder
window.hasOwnProperty(variableName)
Ich denke das ist eigentlich ein Problem mit JSLint. Es wird der folgende Fehler ausgegeben:
Unerwarteter Typ. Vergleiche direkt mit 'undefined'.
Ich glaube, das ist ein schlechter Rat. In JavaScript ist undefined
eine globale Variable, die normalerweise nicht definiert ist. In einigen Browsern können Skripte diese jedoch wie folgt ändern: window.undefined = 'defined'
. In diesem Fall kann ein direkter Vergleich mit undefined
zu unerwarteten Ergebnissen führen. Glücklicherweise erlauben aktuelle ECMA 5-kompatible Browser keine Zuweisungen zu undefined
(und lösen im strikten Modus eine Ausnahme aus).
Ich bevorzuge typeof someVar === "undefined"
, wie Sie geschrieben haben, oder someVar in window
wie Susei vorschlug.
if (typeof someVar === "undefined") { var someVar = "hi!"; }
prüft, ob someVar
(lokal oder global) undefiniert ist.
Wenn Sie nach einer globalen Variablen suchen möchten, können Sie diese verwenden
if(window['someVar'] === undefined) {
...
}
vorausgesetzt, dies ist in einem Browser :)
bfavaretto ist falsch.
Wenn Sie das globale undefined auf einen Wert setzen, werden die Tests von Objekten gegen undefined nicht geändert. Versuchen Sie dies in Ihrer bevorzugten JavaScript-Konsole Ihres Browsers:
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".
Dies liegt einfach daran, dass JavaScript alle und alle Werte ignoriert, die für die undefinierte Variable festgelegt werden sollen.
window.undefined = 'defined';
alert(window.undefined); // Alerts "undefined".
Dies wäre eine einfache Möglichkeit, die Prüfung durchzuführen.
Diese Prüfung würde jedoch fehlschlagen, wenn variableName
deklariert und mit dem boolean value: false
if(window.variableName){
}