1661 Stimmen

Was ist der Zweck des Schlüsselworts var und wann sollte ich es verwenden (oder weglassen)?

ANMERKUNG : Diese Frage wurde aus dem Blickwinkel von ECMAScript Version 3 oder 5 gestellt. Die Antworten könnten mit der Einführung neuer Funktionen in der Version 6 von ECMAScript veraltet sein.

Was genau ist die Funktion des var Schlüsselwort in JavaScript, und was ist der Unterschied zwischen

var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

und

someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

?

Wann würden Sie einen der beiden verwenden und warum/wozu dient er?

1409voto

Greg Punkte 306033

Wenn Sie sich im globalen Bereich befinden, gibt es keinen großen Unterschied. Lesen Sie Kangax's Antwort zur Erläuterung

Wenn Sie in einer Funktion sind, dann var erstellt eine lokale Variable, "no var" sucht in der Kette der Gültigkeitsbereiche, bis es die Variable findet oder auf den globalen Bereich stößt (dann wird sie erstellt):

// These are both globals
var foo = 1;
bar = 2;

function()
{
    var foo = 1; // Local
    bar = 2;     // Global

    // Execute an anonymous function
    (function()
    {
        var wibble = 1; // Local
        foo = 2; // Inherits from scope above (creating a closure)
        moo = 3; // Global
    }())
}

Wenn Sie keine Aufgabe bearbeiten, müssen Sie die var :

var x; // Declare x

773voto

kangax Punkte 38303

Es gibt einen Unterschied .

var x = 1 deklariert die Variable x im aktuellen Bereich (auch Ausführungskontext genannt). Wenn die Deklaration in einer Funktion erscheint, wird eine lokale Variable deklariert; wenn sie sich im globalen Bereich befindet, wird eine globale Variable deklariert.

x = 1 ist dagegen lediglich eine Eigentumsübertragung. Sie versucht zunächst, die x gegen Umfangskette. Wenn es irgendwo in der Bereichskette gefunden wird, führt es die Zuweisung durch; wenn es nichts findet, wird x erst dann wird es schafft x Eigenschaft bei einem globalen Objekt (das ein Objekt der obersten Ebene in einer Bereichskette ist).

Beachten Sie, dass hier keine globale Variable deklariert, sondern eine globale Eigenschaft erstellt wird.

Der Unterschied zwischen den beiden ist fein und könnte verwirrend sein, wenn Sie nicht verstehen, dass Variablendeklarationen erzeugen auch Eigenschaften (nur bei einem variablen Objekt) und dass jede Eigenschaft in Javascript (nun, ECMAScript) bestimmte Flags hat, die ihre Eigenschaften beschreiben - ReadOnly, DontEnum und DontDelete.

Da die Variablendeklaration eine Eigenschaft mit dem DontDelete-Flag erzeugt, ist der Unterschied zwischen var x = 1 y x = 1 (wenn sie im globalen Bereich ausgeführt wird) ist, dass die erste - die Variablendeklaration - die Eigenschaft DontDelete'able erzeugt, die zweite nicht. Infolgedessen kann die durch diese implizite Zuweisung erstellte Eigenschaft aus dem globalen Objekt gelöscht werden, während die erstere - die durch die Variablendeklaration erstellte - nicht gelöscht werden kann.

Aber das ist natürlich nur Theorie, und in der Praxis gibt es noch mehr Unterschiede zwischen den beiden aufgrund verschiedener Fehler in den Implementierungen (z. B. des IE).

Ich hoffe, das macht alles Sinn : )


[Update 2010/12/16]

In ES5 (ECMAScript 5; kürzlich standardisierte, 5. Ausgabe der Sprache) gibt es einen so genannten "Strict Mode" - einen Opt-in-Sprachmodus, der das Verhalten von nicht deklarierten Zuweisungen leicht verändert. Im "strict mode" ist die Zuweisung an einen nicht deklarierten Bezeichner ein ReferenceError . Der Grund dafür war, dass versehentliche Zuweisungen abgefangen und die Erstellung unerwünschter globaler Eigenschaften verhindert werden sollte. Einige der neueren Browser haben bereits damit begonnen, den Strict-Modus zu unterstützen. Siehe zum Beispiel, meine Kompatibilitätstabelle .

142voto

Jonathan Lonowski Punkte 116832

Er sagt, es sei der Unterschied zwischen " . y グローバル " ist nicht ganz richtig.

Es ist vielleicht besser, es als den Unterschied zwischen " . y nächstgelegene ". Der nächste kann sicherlich global sein, aber das wird nicht immer der Fall sein.

/* global scope */
var local = true;
var global = true;

function outer() {
    /* local scope */
    var local = true;
    var global = false;

    /* nearest scope = outer */
    local = !global;

    function inner() {
        /* nearest scope = outer */
        local = false;
        global = false;

        /* nearest scope = undefined */
        /* defaults to defining a global */
        public = global;
    }
}

85voto

kentaromiura Punkte 6369

Wenn Javascript in einem Browser ausgeführt wird, wird Ihr gesamter Code von einer with-Anweisung umgeben, etwa so:

with (window) {
    //Your code
}

Mehr Informationen über with - MDN

Desde var deklariert eine Variable im aktuellen Geltungsbereich gibt es keinen Unterschied zwischen der Erklärung von var Innenfenster und sie überhaupt nicht zu deklarieren.

Der Unterschied besteht darin, dass Sie sich nicht direkt im Fenster befinden, sondern z. B. in einer Funktion oder in einem Block.

Verwendung von var können Sie externe Variablen ausblenden, die den gleichen Namen haben. Auf diese Weise können Sie eine "private" Variable simulieren, aber das ist ein anderes Thema.

Als Faustregel gilt, dass man immer var denn sonst besteht die Gefahr, dass Sie subtile Fehler einführen.

EDIT: Nach den Kritiken, die ich erhalten habe, möchte ich Folgendes betonen:

  • var deklariert eine Variable im aktuellen Geltungsbereich
  • Der globale Geltungsbereich ist window
  • Nicht verwenden var deklariert implizit var im globalen Bereich (Fenster)
  • Deklarieren einer Variablen im globalen Bereich (Fenster) mit var ist dasselbe wie sie wegzulassen.
  • Deklarieren einer Variablen in anderen Bereichen als dem Fenster mit var ist nicht dasselbe wie die Deklaration einer Variablen ohne var
  • Immer erklären var ausdrücklich, weil es gute Praxis ist

51voto

Steve Harrison Punkte 111024

Verwenden Sie immer die var Schlüsselwort, um Variablen zu deklarieren. Warum eigentlich? Gute Programmierpraxis sollte an sich schon Grund genug sein, aber das Weglassen des Schlüsselworts bedeutet, dass es in der グローバル Bereich (eine solche Variable wird als "implizite" globale Variable bezeichnet). Douglas Crockford empfiehlt, niemals implizite Globals zu verwenden und nach der Apple JavaScript-Codierungsrichtlinien :

Jede Variable, die ohne das Symbol var Schlüsselwort wird auf globaler Ebene erstellt erstellt und wird nicht in den Müll geworfen, wenn die Funktion zurückkehrt (weil es nicht aus dem Gültigkeitsbereich geht), was die Gelegenheit für ein Speicherleck.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X