2009-12-08 7 views
6

Ich bin neu in JavaScript.Gibt es einen Zweck, JavaScript-Variablen neu zu deklarieren?

<html> 
<body> 
<script type="text/javascript"> 
var x=5; 
document.write(x); 
document.write("<br />"); 
var x; 
document.write(x); 
</script> 
</body> 
</html> 

Ergebnis ist:

5 
5 

Wenn x zum zweiten Mal deklariert ist es undefiniert sein sollte, aber es hält den vorherigen Wert. Bitte erläutern Sie, ob diese Deklaration einen besonderen Zweck hat.

+0

Der Inhalt Ihrer Frage bezieht sich auf ein bestimmtes Beispiel, das im Folgenden ausreichend beantwortet wurde. Allerdings habe ich festgestellt, dass [diese Antwort] (http://stackoverflow.com/a/12889928/983430) auf eine ähnliche Frage den generischen Fall beantwortet (wann/warum würde eine JavaScript-Variable neu deklarieren verwendet werden?) Im Titel gefragt deine Frage wirklich gut. –

Antwort

20

Sie deklarieren die Variable nicht wirklich.

Die variable Anweisung in JavaScript ist zum Hissen Thema, das bedeutet, dass sie bei Parse-Zeit und später in Laufzeit die Zuordnungen vorgenommen werden ausgewertet.

Ihr Code am Ende der Parse-Phase, vor der Ausführung sieht wie folgt aus etwas:

var x; 
x = 5; 

document.write(x); 
document.write("<br />"); 
document.write(x); 
+0

Danke, jetzt bin ich klar – Warrior

0

Soweit mein Verständnis von Javascript geht, ist die Verwendung des Schlüsselwortes var vollständig optional im globalen Gültigkeitsbereich. Es ist eine andere Geschichte für Funktionen.

Wenn Sie innerhalb einer Funktion sind, verwenden Sie das Schlüsselwort var, um anzugeben, dass die Variable für die Funktion lokal ist (im Gegensatz dazu, dass sie standardmäßig global ist).

Ich persönlich var im globalen Bereich verwenden, um zu zeigen, dass eine Variable zum ersten Mal deklariert und/oder verwendet wird.

Sie können für weitere Informationen auf http://www.w3schools.com/js/js_variables.asp verweisen.

+2

nein ist es nicht: ohne Angabe von 'var' würde eine Variable in den globalen Bereich fallen. – jldupont

+0

var wird für den Bereich innerhalb einer Funktion verwendet, innerhalb einer Funktion, wenn Sie var nicht verwenden, ist es automatisch global. –

+0

heh - alles innerhalb der gleichen 20 Sekunden. –

1

so, wenn das zweite Mal, wenn ihr erklärten x sollte

Welcher Teil der diese Spezifikation nicht definiert werden, sagt?

"Undefiniertes Verhalten" bedeutet nicht "die Variable wird undefined sein".

0

Das zweite var x ist völlig überflüssig.

0

Innerhalb der gleichen Bereich ist es völlig unnötig, eine Variable "redeclare".

0

Auch ein Programmierer möchte var verwenden, um eine Variable zu lokalisieren:

<script> 
var x= 'this is global x'; 
function my_x() { 
var x= 'localized x'; 
alert(x); 
} 
my_x(); 
alert(x); 
</script> 
+0

Obwohl dies möglich ist und eine sehr gute Beschreibung davon, ich bin mir nicht sicher, dass dies eine sehr gute Praxis ist, in variable Namen sollten nicht in der Regel mit anderen wiederholt werden Verwendet. – Jay

0

Sie sollten nie eine Variable innerhalb des gleichen Bereichs redeclare, wenn Sie dies wirklich ändern möchten dann zuweisen. Neudeklaration ist nicht ein anderes Objekt in dieser dynamischen Sprache erstellen erforderlich, wenn Sie x wollen zuordnen String sein gerade:

x = "hello"; 

Es ist nicht erforderlich, dass Sie es wieder auf undefined gesetzt oder ersten neu deklarieren.

Bitte beachten Sie, dass das Ändern des Variablentyps in den meisten Situationen keine sehr gute Übung ist, indem Sie einfach angeben, dass es eine Möglichkeit ist, wenn Sie das benötigen.

7

var allein führt keine Zuweisung durch. Es kennzeichnet nur, dass, wenn Sie den Variablennamen im gesamten Bereich verwenden, in dem die var auftritt, Sie sprechen über eine lokale Variable und nicht global (der kontroverse Standard). Die var wird entdeckt, wenn die Funktion analysiert und hält während dieses Umfangs, also wo Sie es ausdrückte, ist irrelevant:

var a= 0; 

function foo() { 
    a= 1; 
    return a; 
    var a; 
} 

var b= foo(); 
alert('global a='+a+', local a='+b); 

Ergebnisse in global a= 0, local a= 1: obwohl die var Aussage ist nie im Laufe der Ausführung von foo() erreicht, Es ist immer noch wirksam, a eine lokale Variable zu machen.

So ein var x ein zweites Mal im selben Umfang zu deklarieren ist völlig redundant. Sie können dies jedoch immer noch tun, in der Regel, wenn Sie einen lokalen Variablennamen für eine zweite unabhängige Verwendung innerhalb derselben Funktion erneut verwenden. Am häufigsten:

for (var i= 0; i<onething.length; i++) { 
    ...do some trivial loop... 
} 

for (var i= 0; i<anotherthing.length; i++) { 
    ...do another trivial loop... 
} 

Während Sie sicherlich die zweite var und Tools wie jslint tun Sie dies verlangen würde weglassen könnte, könnte es nicht wirklich eine gute Idee sein.

Stellen Sie sich vor, Sie ändern oder entfernen die erste Schleife, so dass sie i nicht mehr als var deklariert. Jetzt ändert die verbleibende zweite Schleife plötzlich die Bedeutung von einer lokalen zu einer globalen Variablen. Wenn Sie beim Aktualisieren der ersten Schleife nicht bemerken, dass die zweite Schleife eine verborgene Abhängigkeit davon hat (und Sie könnten sehr wohl nicht bemerken, dass die Augen das Muster for(...=0 ; ...<...; ...++) in "Oh, das ist nur ein Standard-Iterator" sind), Sie haben ein subtiles und nerviges Debug-Problem.

0

Ich schrieb vor kurzem Code wie:

var obj1 = get_an_object(); 
var v = obj1.get_velocity(); 
v += changes_in_velocity(); 
obj1.set_velocity(v); 

var obj2 = get_an_object(); 
var v = obj2.get_velocity(); 
v += changes_in_velocity(); 
obj2.set_velocity(v); 

(Der eigentliche Code komplizierter und weniger repetitiven war)

So weit wie der Browser betroffen ist, die zweite var v Aussage überflüssig und sinnlos war. Für mich diente es zwei Zwecken. Es hieß, alles, was ich über die alte v wusste, zu vergessen, denn das war eine neue Verwendung. Und das bedeutete, dass ich den Code neu ordnen oder die erste Hälfte kommentieren konnte, ohne die Dinge zu unterbrechen.