103 Stimmen

Javascript-Funktion scoping und hoisting

Ich habe gerade einen tollen Artikel gelesen über JavaScript-Scoping und Heben von Ben Cherry in dem er das folgende Beispiel anführt:

var a = 1;

function b() {
    a = 10;
    return;

    function a() {}
}
b();
alert(a);

Bei Verwendung des obigen Codes meldet der Browser "1".

Ich bin mir immer noch nicht sicher, warum er eine "1" zurückgibt. Einige der Dinge, die er sagt, kommen mir in den Sinn wie: Alle Funktionsdeklarationen werden nach oben gehievt. Man kann eine Variable mit einer Funktion in den Gültigkeitsbereich bringen. Trotzdem verstehe ich es nicht.

0voto

pragun Punkte 431

Langer Beitrag!

Aber es wird die Luft reinigen!

Die Funktionsweise von Java Script besteht aus einem zweistufigen Prozess:

  1. Kompilieren (sozusagen) - In diesem Schritt werden Variablen und Funktionsdeklarationen und ihr jeweiliger Geltungsbereich registriert. Er beinhaltet keine Auswertung von Funktionsausdrücken: var a = function(){} oder Variablenausdruck (wie die Zuweisung von 3 a x im Falle von var x =3; die nichts anderes ist als die Bewertung des R.H.S.-Teils).

  2. Dolmetscher: Dies ist der Teil der Ausführung/Auswertung.

Prüfen Sie die Ausgabe des folgenden Codes, um ein Verständnis zu bekommen:

//b() can be called here!
//c() cannot be called.
console.log("a is " + a);
console.log("b is " + b);
console.log("c is " + c);
var a = 1;
console.log("Now, a is " + a);
var c = function() {};
console.log("Now c is " + c);

function b() {
  //cannot write the below line:
  //console.log(e); 
  //since e is not declared.
  e = 10; //Java script interpreter after traversing from this function scope chain to global scope, is unable to find this variable and eventually initialises it with value 10 in global scope.
  console.log("e is " + e) //  works!
  console.log("f is " + f);
  var f = 7;
  console.log("Now f is " + f);
  console.log("d is " + d);
  return;

  function d() {}
}
b();
console.log(a);

Machen wir es kurz:

  1. In der Kompilierungsphase, a' im globalen Bereich mit dem Wert '' registriert. undefined '. Das Gleiche gilt für '. c ', wäre sein Wert in diesem Moment ' undefined ' und nicht der ' function() '. ' b ' würde als Funktion im globalen Bereich registriert werden. Innerhalb von b Geltungsbereich, ' f ' würde als Variable registriert, die in diesem Moment undefiniert wäre, und die Funktion ' d ' registriert werden würde.

  2. Wenn der Interpreter läuft, werden deklarierte Variablen und function() (und nicht auf Ausdrücke) zugegriffen werden kann, bevor der Interpreter die eigentliche Ausdruckszeile erreicht. Variablen würden also mit ' undefined ' und deklarierte anonyme Funktion kann früher aufgerufen werden. Der Versuch, auf eine nicht deklarierte Variable vor der Initialisierung ihres Ausdrucks zuzugreifen, würde jedoch zu einem Fehler wie diesem führen:

    console.log(e) e = 3;

Was passiert nun, wenn Sie eine Variable und eine Funktion mit demselben Namen deklarieren?

Die Antwort lautet - Funktionen werden immer vor einer Variablen mit demselben Namen deklariert, die dann als Duplikat behandelt und ignoriert wird. Denken Sie daran, dass die Reihenfolge keine Rolle spielt. Die Funktionen haben immer Vorrang. Aber während der Evaluierungsphase können Sie den Variablenverweis auf irgendetwas ändern (es wird gespeichert, was immer die letzte Zuweisung war) Schauen Sie sich den folgenden Code an:

var a = 1;
console.log("a is " + a);

function b() {
  console.log("a inside the function b is " + a); //interpreter finds                                'a' as function() in current scope. No need to go outside the scope to find 'a'.
  a = 3; //a changed
  console.log("Now a is " + a);
  return;

  function a() {}
}
var a; //treated as duplicate and ignored.
b();
console.log("a is still " + a + " in global scope"); //This is global scope a.

0voto

Vishwas S L Punkte 169

Hoisting in JavaScript bedeutet, dass Variablendeklarationen im Programm ausgeführt werden, bevor irgendein Code ausgeführt wird. Die Deklaration einer Variable an einer beliebigen Stelle des Codes ist daher gleichbedeutend mit der Deklaration am Anfang.

0voto

Sumit Pahuja Punkte 51

Es hängt alles vom Anwendungsbereich der Variablen "a" ab. Ich erkläre das, indem ich Bereiche als Bilder erstelle.

Hier wird JavaScript 3 Bereiche erstellen.

i) Globale Reichweite. ii) Geltungsbereich der Funktion b(). iii) Bereich der Funktion a().

enter image description here

Es ist klar, wenn Sie die Methode "alert" aufrufen, gehört der Bereich "Global" zu diesem Zeitpunkt, so dass der Wert der Variablen "a" aus dem Bereich "Global" ausgewählt wird, der nur 1 ist.

0voto

Mustkeem K Punkte 6850

Hoisting ist ein Verhaltenskonzept von JavaScript. Hoisting (sprich Verschieben) ist ein Konzept, das erklärt, wie und wo Variablen deklariert werden sollten.

In JavaScript kann eine Variable deklariert werden, nachdem sie verwendet wurde, da Funktionsdeklarationen und Variablendeklarationen vom JavaScript-Interpreter immer unsichtbar an den Anfang des sie enthaltenden Bereichs verschoben werden.

In den meisten Fällen gibt es zwei Arten von Hebezeugen.

1.Variable Erklärung Heben

Lassen Sie uns dies anhand dieses Codes verstehen.

 a = 5; // Assign 5 to a
 elem = document.getElementById("demo"); // Find an element 
 elem.innerHTML = a;                     // Display a in the element
 var a; // Declare a
  //output-> 5

Hier wird die Deklaration der Variable a vom Javascript-Interpreter zum Zeitpunkt der Kompilierung unsichtbar nach oben verlagert. So waren wir in der Lage, den Wert von a zu erhalten. Aber dieser Ansatz der Deklaration von Variablen wird nicht empfohlen, da wir Variablen bereits wie diese nach oben deklarieren sollten.

 var a = 5; // Assign and declare 5 to a
 elem = document.getElementById("demo"); // Find an element 
 elem.innerHTML = a;                     // Display a in the element
  // output -> 5

Betrachten Sie ein anderes Beispiel.

  function foo() {
     console.log(x)
     var x = 1;
 }

wird eigentlich so interpretiert:

  function foo() {
     var x;
     console.log(x)
     x = 1;
  }

In diesem Fall wird x undefiniert sein

Es spielt keine Rolle, ob der Code ausgeführt wurde, der die Deklaration der Variablen enthält. Betrachten Sie dieses Beispiel.

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

Diese Funktion sieht folgendermaßen aus.

  function foo() {
      var a, b;
      if (false) {
        a = 1;
     }
     return;
     b = 1;
  }

Bei der Variablendeklaration wird nur die Variablendefinition angehoben, nicht die Zuweisung.

  1. Funktionserklärung Heben

Im Gegensatz zum Variablenhub wird der Funktionsrumpf oder der zugewiesene Wert ebenfalls gehievt. Betrachten Sie diesen Code

 function demo() {
     foo(); // this will give error because it is variable hoisting
     bar(); // "this will run!" as it is function hoisting
     var foo = function () {
         alert("this would not run!!");
     }
     function bar() { 
         alert("this will run!!");
     }
 }
 demo();

Da wir nun sowohl das Hochziehen von Variablen als auch das Hochziehen von Funktionen verstanden haben, wollen wir nun diesen Code verstehen.

var a = 1;
function b() {
  a = 10;
  return;
   function a() {}
}
b();
alert(a);

Dieser Code wird folgendermaßen aussehen.

var a = 1;                 //defines "a" in global scope
 function b() {  
   var a = function () {}; //defines "a" in local scope 
    a = 10;                 //overwrites local variable "a"
    return;      
 }       
 b();       
 alert(a); 

Die Funktion a() hat einen lokalen Geltungsbereich innerhalb von b(). a() wird bei der Interpretation des Codes mit seiner Definition nach oben verschoben (nur im Fall von Funktions-Hoisting), so dass a jetzt einen lokalen Geltungsbereich hat und daher den globalen Geltungsbereich von a nicht beeinflusst, während es seinen eigenen Geltungsbereich innerhalb der Funktion b() hat.

0voto

AugustRush Punkte 369

Es geschieht, weil der Variablenname der gleiche ist wie der Funktionsname "a" bedeutet. Daher versucht Javascript, den Namenskonflikt zu lösen, und gibt a = 1 zurück.

Ich war auch verwirrt darüber, bis ich diesen Beitrag über "JavaScript Hoisting" las http://www.ufthelp.com/2014/11/JavaScript-Hoisting.html

Ich hoffe, es hilft.

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