Struppi: Objekt erwartet, in Zeile eines Funktionsaufrufes

Beitrag lesen

Groß? Wieso das denn? Es gibt keinen Unterschied. Gar keinen. Folgende Statements bewirken immer genau das gleiche:

function f() {...};
f = function() {...};
var f = function() {...};

nein, tun sie nicht.
Der Punkt ist, f wird erst zur Laufzeit erzeugt, d.h. du musst die äüß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.

Im globalen Kontext ist es ebenfalls eine *private* Funktion, aber diesmal des globalen Objekts, was sie erst zur globalen Funktion macht.

Das mag richtig sein, nur du kannst in diesem Fall ausserhalb der Funktion auf diese Variabel zughreifen mit var nicht.

Bei gewöhnlichen Variablen gibt es bekanntlich einen Unterschied zwischen z.B. "v=1;" und "var v=1;". Im ersten Fall wird immer eine globale Variable angelegt, im zweiten Fall immer eine private Variable im aktuellen Kontext.

Dass es aber eine Funktion des globalen Objekts ist, stimmt definitiv nicht! Es ist hier eine "innere" Funktion von biste().

und sobald du biste() augeferufen hast ist es eine globale Funktion.

Natürlich, weil sie vorher gar nicht existiert. Deine Aussage stimmt insofern, dass die innere Funktion auf die inneren Variabeln zugreifen kann, also soetwas wie eine privilegierte Funktion ist. Aber es ist halt eine normale globale Variabel die auf die lokalen zugreifen kann:

function Obj() {  
var x = 1;  
 closure = function() {  
    alert(x);  
 }  
}  
Obj();  
x = 2;  
closure();  

Ähhäm... jetzt dämmert mir langsam was du meinst:
Weil man innere Funktionen nicht explizit mit "var" privatisieren kann (die Privatisierung geschieht ja automatisch, siehe oben), glaubt biste() immer, bei der inneren Funktion handele es sich um eine globale, und jubelt ihr deshalb das globale Objekt als "this" unter.

Ja, der Punkt dabei ist, dass das aber auch mit var geschieht.

Das wäre logisch, aber ich halte es trotzdem für einen Fehler in der Konzeption. Der Compiler erkennt ja, dass biste() nur eine Methode im Objekt "Jemand" ist (er gibt ihr den korrekten Kontext "this" mit), folgerichtig sollte er doch auch beim Aufruf der inneren Funktion meinName() den entsprechenden Kontext mitliefern.

Ich nehme an, dass JS nicht das Konzept - ich bin in einer Funktion also in einem Objekt - kennt, sondern der Kontext sich aus dem aufrufendem 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

Wäre es eine globale, dann könnte man sie auch von außerhalb des Objekts "Jemand" oder von außerhalb der Funktion "biste()" aufrufen, was natürlich nicht möglich ist.

wieso nicht? wenn der Varibale ein Wert zugewiesen wurde, kann man das.

Du musst natürlich die globale Variabel meinName erst setzen bevor du sie vewrwenden kannst.

Das verstehe ich nicht: Die Funktion ist doch definiert, und du hälst sie für global, weil kein var davor steht. Also müsste sie von außen aufrufbar sein. Wieso sollte man dann zusätzlich nochmal "die globale Variabel meinName erst setzen" müssen? Das ergibt für mich keinen Sinn...

Weil sie erst zur Laufzeit gesetzt wird.

Struppi.