2010-02-10 20 views
12

Ich bin Überprüfung, ob eine Variable definiert ist oder nicht, und wenn es nicht explizit definiert ist, werde ich es definieren, indem Sie:‚Variable‘ verwendet wurde, bevor es definiert wurde

if (typeof(aVariable) == 'undefined') { 
    var aVariable = value; 
} 

Da die Variable ist nicht definiert JSLint warnt davor, dass es verwendet wird, bevor es definiert wird, und genau das möchte ich.

Wie kann ich das überwinden?

Ich möchte diese Variablen ermöglichen, definieren diese explizit tun:

<script> 
    var aVariable = value; 
</script> 
<script src="myScript.js"></script> 

Also jeder, der dieses Skript enthalten wird einige der Eigenschaften anpassen können. Und ich fürchte, ich kann diese Logik nicht ändern, weil sie auf diese Weise bereits auf hundert Websites verwendet wird.

Scrollen Sie nach unten für die Antworten/Lösungen, weil ich meine eigene Frage beantwortet haben Stack Overflow zeigt es nicht auf. Achten Sie darauf, sie nicht zu verpassen.

Antwort

5

I fand mehr akzeptable Antworten in JSLint Mailingliste, tut mir leid, dass Boldewyn :)

Lösung 1

In IE, auf einer Skript-Ebene (d. H. pro Datei oder pro Skriptblock), wenn es während seiner Parserphase (vor der Ausführung) eine "var" -Deklaration von sieht, setzt es den Wert dieser Variablen zurück, wenn sie bereits existiert.

Also besser wäre, einfach zu tun:

/*global foo: true */ 
if (typeof foo === "undefined") { 
foo = "some value"; 
} 

von nicht „var“ deklarieren und einfach foo zuweisen, foo erhalten automatisch globale Reichweite.

Lösung 2 (Sonderfall)

Wenn explizit gesetzt Variable nicht null oder falsch ist

var foo = foo || "some value"; 
+0

Gibt es eine Leistungseinbuße für Lösung 2? Oder irgendwelche Nebenwirkungen? Ich nehme an, ich wäre nicht in der Lage, das globale Foo zu ändern? – Vanuan

+0

Lösung 2 scheint einen Nebeneffekt zu haben: Die Seite stürzte kurz nach dem Laden von Safari (unter iOS 6.1.3) ab, wenn eine JS-Datei die Zeile 'var window = window || hatte {}; '. Chromium (auf Ubuntu 12.04) hatte solch ein Problem nicht. Seltsam. –

7

Ich denke, was JSLint Ihnen sagt ist, dass Sie Variablen nicht verwenden sollten, bevor sie definiert sind. Wenn Sie zufrieden sind, dass es in Ihrem Szenario angemessen ist, können Sie diese Warnung ignorieren. Wenn Sie nicht absolut sicher sind, denken Sie darüber nach, warum diese Variable noch nicht definiert ist.

Möchten Sie zum Beispiel wirklich testen, ob eine Variable einen Wert gesetzt hat und nicht oder nicht definiert ist?

var aVariable = null; 

... (etwas später)

if (aVariable == null) { 
    aVariable = value; 
} 
2

Try this:

aVariable = null; 

aVariable = typeof(aVariable) == 'undefined' ? null : value; 
-1

Dieser Fehler ausgelöst zu sein scheint, wenn Sie Kamel Gehäuse für Ihre Variablennamen verwenden. Wenn Sie die Variable mit einem Großbuchstaben beginnen (Variable) oder alles klein schreiben (Variable), erhalten Sie nur den "implizierten globalen" Fehler.

Ich bin mir nicht sicher, was es vorschlagen möchte, indem Sie Gehäuse auf Ihren Variablennamen erzwingen, obwohl Sie immer JSLint mit einem Körnchen Salz nehmen müssen. Was Sie hier tun, ist absolut gültig und eine gute Übung, um nicht versehentlich undefinierte Variablen zu verwenden.

+0

Frage: * JSLint warnt davor, dass es verwendet wird, bevor es * definiert ist. Wie ist das mit dem Kamelfall zu tun? Und es ist * nicht * perfekt gültig, weil JSLint recht hat: Die Variable * wird * verwendet, bevor sie definiert wird. – Boldewyn

+1

Lesen Sie meine Antwort gründlich vor der Abstimmung. Es hängt mit der Umhüllung des Variablennamens zusammen, den das OP verwendet: "aVariable". Führen Sie den gleichen Code aus, der in der Frage mit dem Variablennamen geschrieben wurde, der als "avariable", "AVARIABLE" oder "Avariable" geschrieben wurde, und Sie werden bemerken, dass JSLint den Fehler nicht mehr anzeigt. –

+0

Also, welche JSLint benutzt du? Das eine über http://www.jslint.com/ gibt das gleiche Ergebnis unabhängig von der Rechtschreibung, weil es * nichts mit Rechtschreibung * zu tun hat. – Boldewyn

4

Sie konnten die Variable machen (es global ist sowieso) ein explizites Mitglied window:

window.aVariable = 'default'; 

und später

if (! ('aVariable' in window)) { 
    window.aVariable = 'new value'; 
} 

Wenn Sie nicht wollen oder können nicht den Code ändern, ich dann Ich schlage den pragmatischen Ansatz vor und ignoriere JSLints Beschwerden, da der Code sowieso funktioniert (solange Sie den strikten Modus von ECMAScript 5 nicht aktivieren ...).

1

Easiest Ihre Variablen zu deklarieren, bevor Sie jede von ihnen Gebrauch machen:

var aVariable; 

Dies wird mit dem Typ "undefiniert" initialisiert werden, so wird der undefinierte Test noch arbeiten:

if (typeof aVariable == "undefined") { 
    aVariable = value; 
} 
Verwandte Themen