2012-04-10 14 views
1

Eine Anfängerfrage, wahrscheinlich eine triviale Frage. Hier ist der XUL-Code-Snippet:Umfang der JavaScript-Variablen (XUL-bezogen)

<window 
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 

    <script type="application/javascript" src="chrome://.../main.js"/> 

    <button label="Click me!" oncommand="clickhandler()"/> 
</window> 

Der JavaScript-Code:

// main.js 

var test = "Peanut butter"; // a global variable 

function clickhandler() { 
    alert(test); 
} 

Der Interpreter verarbeitet die JavaScript-Datei direkt nach dem Hauptfenster des Starttag zu lesen und geht dann mit dem Rest des XUL-Code. Meiner Meinung nach sollte die Variable test in dem Moment, in dem der Interpreter die Verarbeitung main.js beendet, den Gültigkeitsbereich verlassen. Darüber hinaus sollte die clickhandler() Funktion auch außerhalb des Gültigkeitsbereichs liegen, was bedeutet, dass wenn die Schaltfläche geklickt wird, nichts passieren sollte. Nun, es sei denn, ich erkläre sie zum Beispiel als document.test und document.clickhandler(). Ein simples Experiment hat mich jedoch falsch beurteilt. Sowohl die Funktion als auch die Variable sind vorhanden, wenn auf die Schaltfläche geklickt wird. Wie hoch ist die tatsächliche Lebensdauer von Variablen, die so deklariert sind? Wann sind sie zerstört? Sind sie in der Nähe, bis die Anwendung beendet wird? Best Practices und Referenzen werden sehr geschätzt.

+1

Einige gute Referenzen hier: http://stackoverflow.com/questions/39691/javascript-best-practices. Alles außerhalb einer Funktion und ohne "var" wird im Namespace "window" definiert (z. B. window.test, window.clickhandler) – fenone

Antwort

3

Sie erwarten, dass es sich wie Sprachen verhält, die Sie mit dem Blockbereich gewohnt sind. Ich schlage vor, in Douglas Crockfords Buch "The Good Parts" zu lesen, um besser zu verstehen, warum alles so funktioniert, wie es funktioniert. Wenn Sie das alles von Anfang an lernen, wird es Ihnen viel leichter fallen.

Javascript ist funktional begrenzt .. in diesem Beispiel Test ist innerhalb von foo begrenzt.

In diesem Beispiel können Sie sehen, dass die Funktion den Test ändern kann, da es sich um eine globale Variable handelt.

var test = "peanut butter"; 
var foo = function() { 
    test = "Apple sauce"; 
}; 

Es gibt drei Möglichkeiten, global scoped Variablen zu definieren, von denen alle würde ich vorschlagen, Sie vermeiden (nicht ganz, das ist unmöglich). Globale Variablen sind notwendig, können jedoch gemildert werden. Ihre Lebensdauer ist so lang wie das Javascript geladen ist. Wenn Sie mehrere globale Variablen in verschiedenen .js-Dateien definieren, die von derselben Seite geladen werden, können Sie auf diese globalen Variablen zugreifen, was das versehentliche Überschreiben von vars aus verschiedenen Dateien erschwert.

1: Platzieren Sie eine var-Anweisung außerhalb einer Funktion, wie Sie es getan haben.

2: Fügen Sie es als Eigenschaft dem globalen Objekt hinzu.

window.foo = value; 

3. Verwenden Sie eine Variable, ohne sie zu deklarieren, dies ist eine implizite globale Variable. Achte wirklich auf diese. Die Funktion, die Sie deklariert haben, ist eigentlich ein implizites globales System namens "clickhandler".

foo = value; 

Eine gängige Praxis die Verwendung von globalen Variablen zu minimieren, wird als globalen Abatement bekannt, in dem Sie eine anwendungsspezifische globale Variable definieren Sie den Rest Ihrer globalen Variablen zu halten, Kollision mit anderen Bibliotheken zu vermeiden. Dies geschieht durch Deklarieren eines Objektliterals und Verwenden der zweiten Methode zum Erzeugen globaler Variablen. Verwenden Sie diese Option jedoch nur, wenn Sie globale Variablen benötigen, und versuchen Sie, möglichst im Funktionsumfang zu bleiben.

var AWESOMENEWAPP = {}; 
AWESOMENEWAPP.test = "Peanut Butter"; 

Wenn Sie tiefer bekommen in der Welt von Javascript, werden Sie lernen, über nützliche Dinge wie Verschlüsse beginnen und Ihren Code sauber und organisiert zu halten.

erwarten Sie einfach kein Javascript wie die typischen klassische Sprachen zu arbeiten und Sie werden feststellen, dass es eine mächtige Sprache in seinem eigenen Recht, nur anders.

Auf Ihrer Reise, empfehle ich mit dem Tool JSLint Ihren Code für folgende Konventionen und Fehler zu testen, die Sie nicht sehen, weil es nicht kompiliert wird.

+0

Dies ist eine erschöpfende Antwort, vielen Dank! –

+0

_ "Ihre Lebensdauer ist so lang wie die Seite existiert." _ Der native Look der XUL-Apps hat mich so sehr getäuscht, dass ich vergessen habe, dass es sich um "Seiten" handelt. Bedeutet das, dass, wenn ich mehr Toplevel-Fenster habe, es keine Möglichkeit gibt, eine wirklich globale Variable zu erstellen (die unter ihnen geteilt wird), abgesehen von der Verwendung von XPCOM-Objekten? –

+0

Ich habe XUL nie wirklich benutzt, also bin ich mir nicht sicher, um ehrlich zu sein ... Wenn Sie Daten zwischen verschiedenen Fenstern teilen möchten, ist der beste Weg, dies zu tun (IMO), die Web-Messaging-API, wo Sie Senden Sie eine Nachricht an die anderen Fenster, um Daten zu teilen, und lassen Sie einen Handler, der weiß, dass er die Nachricht erhält und was damit zu tun ist. Auch hier haben Sie keine XUL-Apps verwendet und wissen nicht genau, was Sie versuchen mach es so, es ist schwer zu sagen, was für dich am besten ist. –

1

Ja, globale Funktionen und Variablen sind vorhanden, bis der Benutzer die Anwendung verlässt oder diese Registerkarte schließt, wenn Sie einen Browser verwenden. Aus diesem Grund sollten Sie versuchen, Ihren globalen Gültigkeitsbereich möglichst nicht mit Variablen oder Funktionen zu überfluten.