donp: Objekt erwartet, in Zeile eines Funktionsaufrufes

Beitrag lesen

<script>
function Jemand( werDenn ) {

alert ( '(this===window) in neuem Objekt: ' + (this===window) );

var selbst = this;

this.name = werDenn;
this.biste = function() {

alert ( '(this===window) in Methode: ' + (this===window) );

this.name = "Mr.Spock";

meinName = function () {

Naja, meinName ist in deinem Fall eine Funktion des globalen Objektes, wobei aber ein var davor für die Fragstellung keinen Unterschied macht.

OOops, da hab' ich doch glatt das var davor vergessen. Aber stimmt, es macht hier keinen Unterschied, weil ein Ausdruck "var meinName = function() {...}" immer synonym ist zu "function meinName() {...}".

Dass es aber eine Funktion des globalen Objekts ist, stimmt definitiv nicht! Es ist hier eine "innere" Funktion von biste(). 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.

In der inneren Funktion "meinName()" aber, ist "this" plötzlich das globale Objekt (in der auskommentierten Zeile), denn diese Funktion wird mit "return meinName();" direkt aufgerufen.

Also nicht im Kontext des Objektes (this), folglich muss this in der Funktion das globale Objekt sein.

Im Kontext des Objekts "biste", wo sie überhaupt nur aufgerufen werden kann (siehe oben), also darf ihr "this" nicht das globale Objekt sein, was es aber leider ist.

Aber das ist reine Spekulation. Genauso gut könnte es sein, dass es sich einfach um eine Nachlässigkeit in der urprünglichen Implementierung handelt, die man später auch in der Spezifikation nicht mehr zu bereinigen wagte, um bestehende Programme nicht zu gefährden. Das ist z.B. im Fall der fehlerhaften typeof-Funktion  bekanntermaßen so.

Was ist da fehlerhaft?
Ich hab gesucht und konnte keinen Hinweis darauf finden.

Falsch ist z.B., dass "typeof null" den String 'object' zurückgibt. "null" ist kein objekt. In Javascript sind zwar fast alles Objekte, aber null gehört nicht dazu.
"typeof []" gibt ebenfalls 'object' als Typ für ein Array zurück, was zwar in gewisser Weise stimmt, aber unbrauchbar ist, es sollte  'array' zurückgegeben werden.

Gruß, donp