molily: onclick handler

Beitrag lesen

Mir war irgendwie in Erinnerung, dass folgendes zu einem Problem führt:

function bar () {

var test = "test";
    var a = 1;
    var test = "Tester"; // Problem
}

  
Zu welchem Problem soll das führen? Dieser Code ist identisch mit:  
  
~~~javascript
var test, a;  
test = "test";  
a = 1;  
test = "Tester";

Die entsprechenden Verarbeitungsregeln der ECMAScript-Spezifikation habe ich in https://forum.selfhtml.org/?t=208504&m=1418668 zitiert.

Für jemanden, der das Prinzip mit den Closures noch nicht verstanden hat, ist es aber schneller nachvollziehbar, wenn man eben bei der Variable betont, dass nicht ihr Wert allein, sondern sie selbst "mit allem Drum und Dran" verarbeitet wird. Da ist die sachlich falsche Verwendung des Begriffs "Variablenobjekt" dem Verständnis einer Closure eher zuträglich, als die Verwendung des sachlich korrekten Begriffs.

Sorry, dass ich darauf herumreite ;), aber: In der Tat ist der Begriff Variablenobjekt in seiner *korrekten Verwendung* für das Verständnis von Closures sehr hilfreich und macht die Sache anschaulicher.

Denn das Variablenobjekt mitsamt dessen Funktionsvariablen (Name-Wert-Paare) wird konserviert. Weil es taucht in der Scope-Chain der verschachtelten Funktion (der Closure) auftaucht. Ein Name (Identifier, Bezeichner) wird anhand der Scope-Chain aufgelöst, dabei werden mehrere Variablenobjekte durchlaufen und nach dem Namen durchsucht, um den zugehörigen Wert (bzw. eine Referenz) zu finden.

Der springende Punkt ist, dass das Variablenobjekt immer dasselbe ist und bleibt und von allen angelegten Closures geteilt wird – daher hat das man das beschriebene Problem, wenn man Closures in Schleifen anlegt.

Siehe:
Das Variablenobjekt
Die Scope-Chain (Kette von Gültigkeitsbereichen)

Die Unterscheidung ist also durchaus hilfreich.

Der korrekte Begriff für einen einzelnen Eintrag im Variablenobjekt (was du als »Variablenobjekt« bezeichnet hattest) nennt sich übrigens Binding, soweit ich weiß – das führt allerdings zu weit.

Mathias