Frage

Ich habe eine Javascript-Hauptdatei, die von einem sofort aufgerufenen Abschluss umschlossen ist (um „global“ nicht zu verunreinigen:

(function () {
"use strict";
   var closureVariable = [];
...
}());

Beim Entfernen einer Variablen aus einem Funktionsheader habe ich einen einfachen, groben Codierungsfehler gemacht, sodass mein Code ein Komma anstelle eines Semikolons hatte:

function fred () {
    var i,

    closureVariable = [1,2,3,4];
    confused();
}
function confused () {
    console.log(closureVariable);     // Prints '[]'
}

Das Problem war sicherlich das fehlende Semikolon in der Zeile „var i“.Das Verhalten, von dem ich dachte, dass es passieren sollte, ist jedoch, dass meine jetzt lokal definierte Variable „closureVariable“ die Bereichsdefinition auf höherer Ebene hätte überschatten sollen und der Wert meiner lokal definierten Variablen für Funktionen weiter unten in der Bereichskette verfügbar sein sollte ( das heißt, die Funktion „confused“ hätte „[1,2,3,4]“ ausgeben sollen;

Was verstehe ich hier nicht über Javascript-Bereichsketten?

War es hilfreich?

Lösung

Was Sie erwarten, heißt dynamisches Scoping.Dies ist eine gültige Wahl für das Sprachdesign, obwohl sie heute allgemein als minderwertig angesehen wird.Es ist einfach nicht das, was Javascript macht.Wie viele beliebte Sprachen verwendet Javascript lexikalisches Scoping.Das bedeutet confusedDer Bereich von wird nicht als untergeordneter Bereich von betrachtet fred's, weil seine Definition nicht innerhalb der Definition von liegt fred.Die Tatsache, dass fred Anrufe confused hat keine Wirkung.

Andere Tipps

var i,

    closureVariable = [1,2,3,4];

stellt zwei neue Variablen zur Verfügung fred Funktion und in in diesem Bereich definierten Funktionen.

Diese Variablen unterscheiden sich völlig von allen außerhalb definierten Variablen fred Gültigkeitsbereich, auch wenn sie zufällig denselben Namen haben.

Shadowing bedeutet hier, dass Ihre Variable benannt ist "closureVariable" verhindert jeglichen direkten Zugriff auf die gleichnamige Variable im äußeren Gültigkeitsbereich.

Wenn Sie die engere Redefinierbar durch Auslassen von Semicolon neu definiert, wurde er nur im Rahmen der Fred-Funktion neu definiert.Die verwirrte Funktion existiert im Kontext Ihrer Schließung, sodass es immer noch das ursprüngliche CloseVariable sieht.Wenn Sie Ihre verwirrte Funktion in der Fred-Funktion definiert hätten, sieht er den neuen closevariable und würde [1,2,3,4]

drucken generasacodicetagpre.

oder wenn Sie von außerhalb von Fred () von Fred () von FRED () anrufen möchten,

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top