376 Stimmen

Ist die Verwendung von 'var' zur Deklaration von Variablen optional?

Ist "var" optional?

myObj = 1;

wie bei ?

var myObj = 1;

Bei meinem Test habe ich festgestellt, dass beide funktionieren, ich nehme an var ist fakultativ. Ist das richtig?

597voto

Stefano Borini Punkte 132313

Sie bedeuten unterschiedliche Dinge. Wenn Sie var die Variable in dem Bereich deklariert ist, in dem Sie sich befinden (z. B. in der Funktion). Wenn Sie nicht var Wenn Sie eine Variable mit dem angegebenen Namen oder ein globales Objekt (das Fenster, wenn Sie es im Browser verwenden) finden, wird die Variable an dieses Objekt angehängt. Sie ist dann sehr ähnlich auf eine globale Variable. Sie kann aber immer noch gelöscht werden mit delete (höchstwahrscheinlich durch den Code eines anderen Nutzers, der es ebenfalls versäumt hat, die var ). Wenn Sie die var im globalen Geltungsbereich, ist die Variable wirklich global und kann nicht gelöscht werden.

Dies ist meiner Meinung nach eines der gefährlichsten Probleme mit Javascript, und sollte veraltet sein, oder zumindest Warnungen über Warnungen zu erhöhen. Der Grund ist, es ist leicht zu vergessen var und haben zufällig einen gemeinsamen Variablennamen, der an das globale Objekt gebunden ist. Dies führt zu einem merkwürdigen und schwer zu debuggenden Verhalten.

144voto

deceze Punkte 489288

Dies ist einer der kniffligen Teile von Javascript, aber auch eine seiner Kernfunktionen. Eine Variable, die mit var "beginnt sein Leben" genau dort, wo Sie es angeben. Wenn Sie das var ist es so, als ob Sie über eine Variable sprechen, die Sie schon einmal verwendet haben.

var foo = 'first time use';
foo = 'second time use';

Was den Anwendungsbereich betrifft, so ist es no wahr, dass Variablen automatisch global werden. Vielmehr wird Javascript die Scope-Kette durchlaufen, um zu sehen, ob Sie die Variable schon einmal verwendet haben. Wenn es eine Instanz einer Variablen mit dem gleichen Namen findet, die schon einmal verwendet wurde, wird es diese und den Bereich, in dem sie deklariert wurde, verwenden. Wenn es die Variable nirgends findet, wird es schließlich auf das globale Objekt ( window in einem Browser) und fügt die Variable an sie an.

var foo = "I'm global";
var bar = "So am I";

function () {
    var foo = "I'm local, the previous 'foo' didn't notice a thing";
    var baz = "I'm local, too";

    function () {
        var foo = "I'm even more local, all three 'foos' have different values";
        baz = "I just changed 'baz' one scope higher, but it's still not global";
        bar = "I just changed the global 'bar' variable";
        xyz = "I just created a new global variable";
    }
}

Dieses Verhalten ist besonders leistungsfähig, wenn es mit verschachtelten Funktionen und Rückrufen verwendet wird. Lernen, was functions sind und wie Scope funktioniert, ist das Wichtigste in Javascript.

82voto

Eineki Punkte 14433

Nein, sie sind nicht gleichwertig.

Mit myObj = 1; Sie verwenden eine globale Variable.

Bei der letztgenannten Deklaration wird eine lokale Variable für den von Ihnen verwendeten Bereich erstellt.

Probieren Sie den folgenden Code aus, um die Unterschiede zu verstehen:

external = 5;
function firsttry() {
  var external = 6;
  alert("first Try: " + external);
}

function secondtry() {
  external = 7;
  alert("second Try: " + external);
}

alert(external); // Prints 5
firsttry(); // Prints 6
alert(external); // Prints 5
secondtry(); // Prints 7
alert(external); // Prints 7

Die zweite Funktion ändert den Wert der globalen Variable "external", die erste Funktion jedoch nicht.

23voto

bcherry Punkte 6982

Es geht um etwas mehr als nur um den Unterschied zwischen lokal und global. Globale Variablen, die mit var sind anders als die, die ohne sie erstellt werden. Bedenken Sie dies:

var foo = 1; // declared properly
bar = 2; // implied global
window.baz = 3; // global via window object

Ausgehend von den bisherigen Antworten sind diese globalen Variablen, foo , bar et baz sind alle gleichwertig. Das ist no den Fall. Globale Variablen, die mit var werden (korrekt) die internen [[DontDelete]] Eigenschaft, so dass sie nicht gelöscht werden können.

delete foo; // false
delete bar; // true
delete baz; // true

foo; // 1
bar; // ReferenceError
baz; // ReferenceError

Aus diesem Grund sollten Sie immer verwenden. var auch für globale Variablen.

17voto

Steve Kallestad Punkte 3354

Es gibt so viel Verwirrung um dieses Thema, und keine der vorhandenen Antworten deckt alles klar und direkt ab. Hier sind einige Beispiele mit eingefügten Kommentaren.

//this is a declaration
var foo;

//this is an assignment
bar = 3;

//this is a declaration and an assignment
var dual = 5;

Eine Erklärung setzt ein DontDelete-Flag. Eine Zuweisung tut dies nicht.

Eine Deklaration bindet die Variable an den aktuellen Bereich.

Eine zugewiesene, aber nicht deklarierte Variable sucht nach einem Bereich, an den sie sich anhängen kann. Das bedeutet, dass sie die Nahrungskette der Bereiche durchläuft, bis eine Variable mit demselben Namen gefunden wird. Wenn keine gefunden wird, wird sie an den obersten Bereich angehängt (der allgemein als global bezeichnet wird).

function example(){
  //is a member of the scope defined by the function example
  var foo;

  //this function is also part of the scope of the function example
  var bar = function(){
     foo = 12; // traverses scope and assigns example.foo to 12
  }
}

function something_different(){
     foo = 15; // traverses scope and assigns global.foo to 15
}

Eine sehr klare Beschreibung des Geschehens finden Sie hier Analyse der Löschfunktion behandelt ausführlich die Instanziierung und Zuweisung von Variablen.

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