2013-11-26 3 views
18

Ich habe schon eine Weile mich gefragt, ob ich eine Variable in JS verwenden kann, bevor sie definiert ist, wie die folgenden:Kann ich in Javascript eine Variable verwenden, bevor sie deklariert wird?

var country = "USA"; 
switch (country) { 
    case "USA": 
     country = i; 
    case "blach": 
     //not finished yet 
} 
/* 
    put a whole 
    bunch more code here 
*/ 
var i = 10; 

Ist das gültig? Ist es erlaubt? Und wenn ja, wie lautet der technische Ausdruck dafür?

+0

Sorry, aber ich fühlte, dass diese Frage nicht "genug Forschung Aufwand" zeigt. [Variable scope] (http://en.wikipedia.org/wiki/Scope_ (computer_science) #JavaScript) ist grundlegendes Programmierwissen. Einfach den Code ausführen, sollte bewiesen haben, dass das erlaubt war. Die Frage ist wahrscheinlich "wie lautet der technische Ausdruck für die Verwendung von Variablen, bevor sie deklariert werden". Fühlen Sie sich frei, die Frage zu bearbeiten, und der Downvote könnte verschwinden. Ich werde darauf hinweisen, dass sogar [diese] (http://stackoverflow.com/questions/500431/javascript-variable-scope) JavaScript-Frage keine Erwähnung von _hoisting_ hat. – andyb

Antwort

19

Dies ist eine Technik, die von der JavaScript-Engine hoisting verwendet wird. Der Parser wird die gesamte Funktion vor dem Ausführen durchlesen, und alle Variablendeklarationen (d. H. Unter Verwendung des Schlüsselworts var) werden so ausgeführt, als ob sie sich an der Spitze des enthaltenden Bereichs befinden. So Ihr Code verhält sich wie:

var country; 
var i; 

country = "USA"; 
switch (country) { 
case "USA": 
    country = i; 
case "blach": 
    //not finished yet 
} 

i = 10; 

So i über den gesamten Umfang deklariert ist, aber sein Wert ist undefined, bis die i = 10 Anweisung ausgeführt.

In ECMAScript-Termen, wenn eine Funktion aufgerufen wird, erstellt der neue lexikalische Bereich der Funktion VariableEnvironment, bevor einer der Code der Funktion ausgeführt wird. In ECMAScript 10.5, step 8:

8. Für jeden VariableDeclaration ... d in Code, in Quelltext tun, um

ein. Lassen Sie dn der Bezeichner in d sein.

...

i. Rufen Sie env 's CreateMutableBinding konkrete Methode über die dn und konfigurableBindings als Argumente.

ii. Rufen Sie env 's SetMutableBinding konkrete Methode, die dn, undefined und strenge als Argumente übergeben.

Dies ist ein ganz Bissen, aber im Grunde sagt es:

Bevor Sie eine Funktion ausführen, schauen Sie durch den Quellcode der Funktion für Erklärungen wie var [identifierName].

Für jede Erklärung Sie, erstellen Sie eine neue Variable in der Funktion des Oszilloskops mit dem Namen [identifierName] verwendete in der Deklaration und dann seinen Wert auf undefined

+1

Schön, dass Sie einen Verweis auf 10.5.8 +1 dafür hinzugefügt haben :) – C5H8NNaO4

3

Ja. In JavaScript-Variablen sind hoisted

Eine variable Anweisung Variablen deklariert, die erstellt werden, wie in 10.5 definiert. Variablen werden beim Erstellen als nicht definiert initialisiert. Eine Variable mit einem Initialisierer erhält den Wert ihrer AssignmentExpression , wenn das VariableStatement ausgeführt wird, nicht wenn die Variable erstellt wird. ES5 §12.2
Wo 10.5 Schritt 8 das Teil von Interesse ist

5

Es variable hoisting genannt wird, und es ist ein gutes Konzept zu verstehen, wie es gelegentlich Fehler erstellen kann die schwer aufzuspüren.

Zum Beispiel:

var stuff = 'stuff'; 
function() { 
console.log(stuff); //outputs 'undefined' 
var stuff = 'other stuff'; 
console.log(stuff); //outputs 'other stuff' 
} 

Die ersten Ausgänge console.logundefined weil die var stuff in der Funktion war gehißt an die Spitze der Funktion.

//theoretical compiled output 
var stuff = 'stuff'; 
function() { 
var stuff; //has not been defined 
console.log(stuff); 
stuff = 'other stuff'; //defined here 
console.log(stuff); 
} 

Ohne Kenntnis des variablen Hebens kann dieses Ergebnis verwirrend sein.

Aus diesem Grund sehen Sie, wenn Sie professionell entwickelten JavaScript-Code betrachten, normalerweise, dass alle Variablen in einer Funktion oben deklariert sind.

2

Die Jungen Antworten sind richtig finden. Für Ihr Beispiel ist es jedoch erwähnenswert, dass countryundefined ist. wie aspillers Code erwähnt verhält sich wie unter

var country; 
var i; 

country = "USA"; 

switch (country) { 
case "USA": 
    country = i; 
case "blach": 
    //not finished yet 
} 

i = 10; 
alert(country) //undefined; 

aber wenn Ihr case Aussage für „USA“ lief, wurde i undefined so dies country zugewiesen wurde. versuchen Sie es hier in diesem fiddle.

Ich denke, dass Sie nur wissen müssen, dass, obwohl die Variablen-Deklarationen gehisst werden, die Wertzuweisungen nicht sind.

+0

Ich bin neu in 'JS', also weiß ich nicht viel. Verzeihung, aber was ich verstanden habe, ist, dass "hissen" bedeutet, dass, egal wo die "var" ist, im aktuellen Umfang sein kann; Es wird vor dem Start der Ausführung ein Speicher zugewiesen. Warum ist die Variable nicht definiert? –

+1

@VikasBansal - Nur die Referenz wird gehisst. Die Zuweisung eines Wertes wird nicht ausgelöst. Also wird im Beispiel 'country = i' in der switch-Anweisung nur undefined dem Land zugewiesen, da der Wert von' i' direkt am Ende zugewiesen wird –