849 Stimmen

Was ist lexikalischer Geltungsbereich?

Was ist eine kurze Einführung in das lexikalische Scoping?

109 Stimmen

In Podcast 58 ermutigt Joel zu Fragen wie diesen, da er möchte, dass SO DER Ort für Antworten wird, auch wenn sie bereits an anderer Stelle beantwortet wurden. Dies ist eine berechtigte Frage, auch wenn man sie etwas höflicher formulieren könnte.

0 Stimmen

Und dann speziell de.wikipedia.org/wiki/Scope_(Programmierung) die ein schönes (Pascal/Delphi) Beispiel für verschachtelte Bereiche in verschachtelten Prozeduren enthält.

18 Stimmen

Es ist möglich, dass der Fragesteller nicht fließend Englisch spricht (oder sprach), als er diese Frage schrieb.

43voto

AConsumer Punkte 1891

Lexikalischer Anwendungsbereich bedeutet, dass in einer verschachtelten Gruppe von Funktionen, die inneren Funktionen haben Zugang zu den Variablen und anderen Ressourcen ihres übergeordneten Bereichs .

Das bedeutet, dass die Funktionen der Kinder lexikalisch an den Ausführungskontext ihrer Eltern gebunden sind.

Der lexikalische Geltungsbereich wird manchmal auch bezeichnet als statischer Anwendungsbereich .

function grandfather() {
    var name = 'Hammad';
    // 'likes' is not accessible here
    function parent() {
        // 'name' is accessible here
        // 'likes' is not accessible here
        function child() {
            // Innermost level of the scope chain
            // 'name' is also accessible here
            var likes = 'Coding';
        }
    }
}

Sie werden feststellen, dass der lexikalische Bereich vorwärts arbeitet, d.h. der Name kann von den Ausführungskontexten seiner Kinder aufgerufen werden.

Aber es funktioniert nicht rückwärts zu seinen Eltern, was bedeutet, dass die Variable likes kann von seinen Eltern nicht erreicht werden.

Daraus ergibt sich auch, dass Variablen, die in verschiedenen Ausführungskontexten den gleichen Namen haben, auf dem Ausführungsstapel von oben nach unten Vorrang haben.

Eine Variable, die einen ähnlichen Namen wie eine andere Variable in der innersten Funktion (oberster Kontext des Ausführungsstapels) hat, hat einen höheren Vorrang.

Source : .

42voto

Praveen Kishor Punkte 2103

Ein lexikalischer Gültigkeitsbereich in JavaScript bedeutet, dass eine außerhalb einer Funktion definierte Variable innerhalb einer anderen, nach der Variablendeklaration definierten Funktion zugänglich sein kann. Das Gegenteil ist jedoch der Fall: Auf Variablen, die innerhalb einer Funktion definiert sind, kann außerhalb dieser Funktion nicht zugegriffen werden.

Dieses Konzept wird in JavaScript häufig in Schließungen verwendet.

Nehmen wir an, wir haben den folgenden Code.

var x = 2;
var add = function() {
    var y = 1;
    return x + y;
};

Wenn Sie nun add() aufrufen --> wird 3 ausgegeben.

Die Funktion add() greift also auf die globale Variable x die vor der Methodenfunktion add definiert ist. Dies wird aufgrund des lexikalischen Scopings in JavaScript aufgerufen.

3 Stimmen

Bedenken Sie, dass der Codeausschnitt für eine Sprache mit dynamischem Umfang bestimmt war. Wenn die add() Funktion unmittelbar nach dem angegebenen Codeschnipsel aufgerufen würde, würde sie ebenfalls 3 ausgeben. Lexikalisches Scoping bedeutet nicht einfach, dass eine Funktion auf globale Variablen außerhalb des lokalen Kontexts zugreifen kann. Der Beispielcode hilft also nicht wirklich, um zu zeigen, was lexikalisches Scoping bedeutet. Um lexikalisches Scoping im Code zu zeigen, braucht man ein Gegenbeispiel oder zumindest eine Erklärung der anderen möglichen Interpretationen des Codes.

37voto

SimplGy Punkte 19473

Ich liebe die ausführlichen, sprachunabhängigen Antworten von Leuten wie @Arak. Da diese Frage getaggt wurde JavaScript Ich möchte jedoch einige Anmerkungen machen, die sich speziell auf diese Sprache beziehen.

In JavaScript haben wir folgende Möglichkeiten für das Scoping:

  • so wie es ist (keine Anpassung des Umfangs)
  • lexikalisch var _this = this; function callback(){ console.log(_this); }
  • gebunden callback.bind(this)

Ich denke, es ist erwähnenswert, dass JavaScript hat nicht wirklich dynamisches Scoping . .bind regelt die this und das ist nahe dran, aber technisch nicht dasselbe.

Hier ist ein Beispiel, das beide Ansätze demonstriert. Sie tun dies jedes Mal, wenn Sie eine Entscheidung über den Umfang von Rückrufen treffen, so dass dies für Versprechen, Ereignis-Handler und mehr gilt.

Lexikalisch

Das könnte man folgendermaßen bezeichnen Lexical Scoping von Rückrufen in JavaScript:

var downloadManager = {
  initialize: function() {
    var _this = this; // Set up `_this` for lexical access
    $('.downloadLink').on('click', function () {
      _this.startDownload();
    });
  },
  startDownload: function(){
    this.thinking = true;
    // Request the file from the server and bind more callbacks for when it returns success or failure
  }
  //...
};

Gebunden

Eine andere Möglichkeit des Umfangs ist die Verwendung von Function.prototype.bind :

var downloadManager = {
  initialize: function() {
    $('.downloadLink').on('click', function () {
      this.startDownload();
    }.bind(this)); // Create a function object bound to `this`
  }
//...

Diese Methoden sind, soweit ich weiß, verhaltensmäßig gleichwertig.

2 Stimmen

Verwendung von bind hat keinen Einfluss auf den Geltungsbereich.

24voto

J.K.A. Punkte 6874

In einfacher Sprache ist der lexikalische Geltungsbereich eine Variable, die außerhalb Ihres Geltungsbereichs definiert ist, oder der obere Geltungsbereich ist automatisch innerhalb Ihres Geltungsbereichs verfügbar, was bedeutet, dass Sie sie dort nicht übergeben müssen.

Ejemplo:

let str="JavaScript";

const myFun = () => {
    console.log(str);
}

myFun();

// Ausgabe: JavaScript

3 Stimmen

Die kürzeste und beste Antwort für mich mit einem Beispiel. Man hätte noch hinzufügen können, dass die Pfeilfunktionen von ES6 das Problem mit bind . Mit ihnen wird die bind ist nicht mehr erforderlich. Weitere Informationen über diese Änderung finden Sie unter stackoverflow.com/a/34361380/11127383

18voto

ratiotile Punkte 825

Lexikalischer Geltungsbereich bedeutet, dass eine Funktion Variablen in dem Kontext nachschlägt, in dem sie definiert wurde, und nicht in dem sie unmittelbar umgebenden Geltungsbereich.

Sehen Sie sich an, wie der lexikalische Bereich in Lispeln wenn Sie mehr Details wünschen. Die ausgewählte Antwort von Kyle Cronin in Dynamische und lexikalische Variablen in Common Lisp ist viel klarer als die Antworten hier.

Zufälligerweise habe ich das erst in einem Lisp-Kurs gelernt, und es gilt zufällig auch für JavaScript.

Ich habe diesen Code in der Konsole von Chrome ausgeführt.

// JavaScript               Equivalent Lisp
var x = 5;                //(setf x 5)
console.debug(x);         //(print x)
function print_x(){       //(defun print-x ()
    console.debug(x);     //    (print x)
}                         //)
(function(){              //(let
    var x = 10;           //    ((x 10))
    console.debug(x);     //    (print x)
    print_x();            //    (print-x)
})();                     //)

Ausgabe:

5
10
5

2 Stimmen

Dies ist die hilfreichste Antwort. Wenn Sie zustimmen, geben Sie bitte eine höhere Bewertung ab.

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