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?
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?
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.
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.
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.
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.
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 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.