donp: Objekt erwartet, in Zeile eines Funktionsaufrufes

Beitrag lesen

[...] aber der Unterschied von
var meinName = function() {...}
meinName = function() {...}

innerhalb der funktion ist gross und darum ging es

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

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

Und zwar wird jeweils eine neue Funktion im aktuellen Kontext definiert. Geschieht das innerhalb eines Objekts (oder Funktion), dann handelt es sich um eine *private* Funktion dieses Objekts, die von außerhalb nicht aufgerufen werden kann. Im globalen Kontext ist es ebenfalls eine *private* Funktion, aber diesmal des globalen Objekts, was sie erst zur globalen Funktion macht.

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.

Ä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.
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.

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.

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...

Don P