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


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


1389
2017-09-24 08:54


Ursprung


Antworten:


Wenn Sie im globalen Geltungsbereich sind, gibt es keinen Unterschied.

Wenn Sie in einer Funktion sind, dann var erstellt eine lokale Variable, "no var" sucht die Scope-Kette nach, bis sie die Variable findet oder den globalen Bereich erreicht (an welchem ​​Punkt sie erstellt wird):

// 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 du keine Aufgabe machst, musst du sie verwenden var:

var x; // Declare x

1254
2017-09-24 08:55



Es besteht ein Unterschied.

var x = 1  deklariert Variable  x im aktuellen Umfang (auch als Ausführungskontext bezeichnet). Wenn die Deklaration in einer Funktion erscheint - eine lokale Variable wird deklariert; Wenn es sich um einen globalen Gültigkeitsbereich handelt, wird eine globale Variable deklariert.

x = 1Auf der anderen Seite ist es nur eine Eigentumszuweisung. Es versucht zuerst zu lösen x gegen Umfang Kette. Wenn es irgendwo in dieser Gültigkeitsbereichskette gefunden wird, führt es eine Zuweisung durch; wenn es nicht findet x, nur dann es erstellt x Eigenschaft auf einem globalen Objekt (Dies ist ein Top-Level-Objekt in einer Scope-Kette).

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

Der Unterschied zwischen den beiden ist subtil und könnte verwirrend sein, wenn Sie das nicht verstehen Variablendeklarationen erstellen auch Eigenschaften (nur auf einem Variablenobjekt) und dass jede Eigenschaft in Javascript (naja, ECMAScript) bestimmte Flags hat, die ihre Eigenschaften beschreiben - ReadOnly, DontEnum und DontDelete.

Da die Variablendeklaration eine Eigenschaft mit dem DontDelete-Flag erstellt, ist der Unterschied zwischen var x = 1 und x = 1 (Wenn es im globalen Gültigkeitsbereich ausgeführt wird) ist, dass die frühere eine - Variablendeklaration die DontDelete'able -Eigenschaft erstellt, und letztere nicht. Folglich kann die Eigenschaft, die über diese implizite Zuweisung erstellt wurde, aus dem globalen Objekt gelöscht werden, und die vorherige, die über die Variablendeklaration erstellt wurde, kann nicht gelöscht werden.

Aber das ist natürlich nur Theorie, und In der Praxis gibt es noch mehr Unterschiede zwischen den beiden, aufgrund verschiedener Bugs in Implementierungen (wie denen von IE).

Hoffe es macht alles Sinn:)


[Update 16.12.2010]

In ES5 (ECMAScript 5; kürzlich standardisiert, 5. Ausgabe der Sprache) gibt es einen sogenannten "strikten Modus" - einen Opt-in-Sprachmodus, der das Verhalten von nicht deklarierten Zuweisungen geringfügig ändert. Im strikten Modus ist die Zuweisung zu einem nicht deklarierten Bezeichner a Referenzfehler. Der Grund dafür war zufällige Zuordnungen zu finden und die Erzeugung unerwünschter globaler Eigenschaften zu verhindern. Einige der neueren Browser haben bereits mit der Unterstützung für den strikten Modus begonnen. Siehe zum Beispiel meine Kompat-Tabelle.


695
2017-09-24 13:38



Sagen wir, es ist der Unterschied zwischenlokal und global"ist nicht ganz richtig.

Es könnte besser sein, es als den Unterschied zwischen "lokal und nächste"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;
    }
}

130
2017-09-24 09:50



Wenn Javascript in einem Browser ausgeführt wird, ist der gesamte Code von einer With-Anweisung umgeben:

with (window) {
    //Your code
}

Weitere Informationen zu with - MDN

Schon seit var deklariert eine Variable im aktuellen Umfang gibt es keinen Unterschied zwischen deklarieren var  Innenfenster und es überhaupt nicht zu erklären.

Der Unterschied kommt, wenn Sie nicht direkt im Fenster sind, z.B. innerhalb einer Funktion oder in einem Block.

Verwenden var können Sie externe Variablen verbergen, die denselben Namen haben. Auf diese Weise können Sie eine "private" Variable simulieren, aber das ist ein anderes Thema.

Eine Faustregel ist immer zu verwenden var, denn sonst laufen Sie Gefahr, subtile Bugs einzuführen.

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

  • var deklariert eine Variable im aktuellen Umfang
  • Der globale Umfang ist window
  • Nicht verwenden var erklärt implizit var im globalen Umfang (Fenster)
  • Deklarieren einer Variable im globalen Bereich (Fenster) mit var ist dasselbe wie es wegzulassen.
  • Deklarieren einer Variable in Bereichen, die sich von Fenstern unter Verwendung von unterscheiden var  ist nicht das Gleiche als eine Variable ohne deklarieren var
  • Immer erklären var explizit, weil es eine gute Praxis ist

76
2017-09-24 09:17



Du solltest immer benutze die var Schlüsselwort zum Deklarieren von Variablen. Warum? Eine gute Kodierungspraxis sollte an sich schon Grund genug sein, aber eine Variable ohne das zu deklarieren var keyword bedeutet, dass es in der deklariert ist global scope (eine Variable wie diese wird als "implicated" global bezeichnet). Douglas Crockford empfiehlt, keine implizierten Globals zu verwendenund nach der Apple JavaScript Codierungsrichtlinien:

Jede Variable, die ohne das erstellt wird var   Das Schlüsselwort wird im globalen Gültigkeitsbereich erstellt   und wird nicht Müll gesammelt, wenn die   Funktion kehrt zurück (weil es nicht funktioniert   (außerhalb des Geltungsbereichs), präsentiert die   Möglichkeit für ein Speicherleck.

Kurz gesagt, Deklarieren Sie Variablen immer mit dem var Stichwort.


37
2017-09-24 09:52



Hier ist ein gutes Beispiel dafür, wie Sie davon abkommen können, lokale Variablen nicht zu deklarieren var:

<script>
one();

function one()
{
    for (i = 0;i < 10;i++)
    {
        two();
        alert(i);
    }
}

function two()
{
    i = 1;
}
</script>

(i wird bei jeder Iteration der Schleife zurückgesetzt, da sie nicht lokal in der Schleife deklariert ist for Schleife, aber global), was schließlich zu einer Endlosschleife führt


27
2017-09-24 09:31



Ich würde sagen, es ist besser zu benutzen var in den meisten Situationen.

Lokale Variablen sind immer schneller als die Variablen im globalen Gültigkeitsbereich.

Wenn Sie nicht verwenden var Um eine Variable zu deklarieren, wird die Variable im globalen Bereich sein.

Für weitere Informationen können Sie in Google nach "Scope Chain JavaScript" suchen.


12
2017-09-24 09:02



ein weiterer Unterschied z.B

var a = a || [] ; // works 

während

a = a || [] ; // a is undefined error.

8
2017-08-09 22:11



Verwenden var Es ist immer eine gute Idee, zu verhindern, dass Variablen den globalen Geltungsbereich und Variablen in Konflikt miteinander bringen, was zu unerwünschtem Überschreiben führt.


7
2018-04-04 23:14



Ohne var - Globale Variable.

Sehr zu empfehlen IMMER benutzen var Anweisung, weil init globale Variable im lokalen Kontext - ist böse. Aber, wenn Sie diesen schmutzigen Trick brauchen, sollten Sie einen Kommentar am Anfang der Seite schreiben:

/* global: varname1, varname2... */

7
2017-09-24 09:04



Benutze es nicht var!

var war der Weg vor der ES6, eine Variable zu deklarieren. Wir sind jetzt in der Zukunft, und Sie sollten als solche codieren.

Benutzen const und let

const sollte für 95% der Fälle verwendet werden. Es macht es so, dass die Variablenreferenz sich nicht ändern kann, daher können sich Array-, Objekt- und DOM-Knoteneigenschaften ändern und sollten wahrscheinlich sein const.

let sollte für jede Variable verwendet werden, die eine Neuzuweisung erwartet. Dies beinhaltet innerhalb einer for-Schleife. Wenn du jemals schreibst varName = über die Initialisierung hinaus verwenden let.

Beide haben Block-Level-Scoping, wie in den meisten anderen Sprachen erwartet.


4
2017-08-15 18:49