Ich habe mich eine Weile gefragt, ob ich eine Variable in JS verwenden kann, bevor sie definiert wird, wie zum Beispiel die folgende:

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 Fachbegriff dafür?

29
tjons 26 Nov. 2013 im 19:12

4 Antworten

Beste Antwort

Dies ist eine Technik, die von der JavaScript-Engine namens hoisting . Der Parser liest die gesamte Funktion durch, bevor er sie ausführt, und alle Variablendeklarationen (d. H. Mit dem Schlüsselwort var) werden so ausgeführt, als ob sie sich am oberen Rand des enthaltenen Bereichs befinden. Ihr Code verhält sich also wie folgt:

var country;
var i;

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

i = 10;

Daher wird i im gesamten Bereich deklariert , sein Wert ist jedoch undefined, bis die Anweisung i = 10 ausgeführt wird.

In ECMAScript-Begriffen erstellt der neue lexikalische Bereich der Funktion beim Aufrufen einer Funktion ihre VariableEnvironment, bevor der Code der Funktion ausgeführt wird. In ECMAScript 10.5, Schritt 8:

8. Für jede VariableDeclaration ... d in Code in der Reihenfolge des Quelltextes

ein. Sei dn der Bezeichner in d.

...

ich. Rufen Sie die konkrete CreateMutableBinding-Methode von env auf und übergeben Sie als Argumente dn und configureBindings .

ii. Rufen Sie die konkrete SetMutableBinding-Methode von env auf und übergeben Sie als Argumente dn , undefined und strict .

Das ist ein ziemlicher Schluck, aber im Grunde heißt es:

Bevor Sie eine Funktion ausführen, durchsuchen Sie den Quellcode der Funktion nach Deklarationen wie var [identifierName].

Erstellen Sie für jede gefundene Deklaration eine neue Variable im Funktionsumfang mit dem in der Deklaration verwendeten Namen [identifierName] und setzen Sie ihren Wert auf undefined

25
apsillers 26 März 2015 im 11:59

Es heißt variables Heben und ist ein Gutes Konzept zu verstehen, da es gelegentlich Fehler verursachen kann, die schwer zu finden sind.

Beispielsweise:

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

Das erste console.log gibt undefined aus, da die Variable stuff in der Funktion an die Spitze der Funktion gehoben wurde.

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

Wenn Sie sich professionell entwickelten JavaScript-Code ansehen, werden aus diesem Grund normalerweise alle Variablen in einer Funktion oben deklariert.

7
adamb 26 Nov. 2013 im 15:39

Die Antworten der Jungs sind richtig. In Ihrem Beispiel ist jedoch zu beachten, dass country undefined ist. Wie Aspiller bereits erwähnt haben, verhält sich Ihr Code wie folgt

var country;
var i;

country = "USA";

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

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

Als Ihre case Anweisung für "USA" ausgeführt wurde, war i undefiniert, sodass dies country zugewiesen wurde. Versuchen Sie es hier in dieser Geige.

Ich denke, Sie müssen sich nur bewusst sein, dass die Variablenzuweisungen zwar hochgezogen werden, die Wertzuweisungen jedoch nicht.

2
Mark Walters 26 Nov. 2013 im 15:18

Ja. In JavaScript werden Variablen hochgezogen

Eine Variablenanweisung deklariert Variablen, die wie in 10.5 definiert erstellt wurden. Variablen werden beim Erstellen auf undefiniert initialisiert . Einer Variablen mit einem Initialisierer wird der Wert ihres AssignmentExpression zugewiesen, wenn das VariableStatement ausgeführt wird , nicht wenn die Variable erstellt wird. ES5 §12.2
Wobei 10.5 Schritt 8 der interessierende Teil ist

3
Moritz Roessler 26 Nov. 2013 im 15:40