donp: Objekt erwartet, in Zeile eines Funktionsaufrufes

Beitrag lesen

Hi Struppi,

Der Punkt ist, f wird erst zur Laufzeit erzeugt, d.h. du musst die äußere Funktion zuerst aufrufen, damit die inneren Variabeln einen Wert haben, werden diese nicht mit var lokal gemacht sind stehen diese im globalen Kontext zu Verfügung.

Ah ja, das stimmt. Hatte erst geglaubt, dass f=function(){...} und var f=function(){...} dasselbe ist. Aber klar, es gibt einen großen Unterschied.

Ich nehme an, dass JS nicht das Konzept - ich bin in einer Funktion also in einem Objekt - kennt, sondern der Kontext sich aus dem aufrufenden Objekt ergibt.

window.f() { this = window}
obj.f() { this = obj}
obj.obj2.f() { this = obj.obj2;}

und bei einer inneren lokal definierten Funktion ist der Kontext null also wird laut ECMA Spezifikation this = window

Da hast du es auf den Punkt gebracht: Dass "der Kontext sich aus dem aufrufenden Objekt ergibt". Das steht ja auch so in der Spezifikation.
Aber eben, dass "bei einer inneren lokal definierten Funktion ist der Kontext null" sein muss, will mir einfach nicht einleuchten, und da bin ich wie gesagt nicht alleine.

Ich kann es zur Kenntnis nehmen, ja, kann auch die damit verbundene Unbequemlichkeit in Kauf nehmen, aber es fehlt mir bis dato das Verständnis, waum es so implementiert ist und nicht vielmehr so, wie man es erwarten würde: Dass nämlich die innere, mit var deklarierte Closure den Kontext des umgebenden, also des aufrufenden Objekts bekommt, wie das sonst auch der Fall ist.

function Obj() {

var closure = function() {
  alert(this===window); //gibt 'true' aus
 }
 closure();
}
Obj();

Laufzeit hin oder her – Der Compiler sollte die mit var deklarierte closure genauso behandeln können, als wäre sie mit this.closure deklariert, was die Übergabe des Kontekxts betrifft, denn er sieht ja, dass es eine innere, lokale Funktion ist, die auch nur von innen aufgerufen werden kann.

Wenn sie nicht mit var deklariert wird, ist sie nach dem ersten Aufruf global, das stimmt. Dann darf sie von mir aus auch den globalen Kontext haben, ich wil ja nicht so sein ;)

Gruß, Don P