donp: Objekt erwartet, in Zeile eines Funktionsaufrufes

Beitrag lesen

http://www.ecma-international.org/publications/standards/Ecma-262.htm
Ich tu mich schwer damit

Für diesen Fall scheint mir der Absatz relevant zu sein:

Function Code (10.2.3)
[..]
• The caller provides the this value. If the this value provided by the caller is not an object (including
the case where it is null), then the this value is the global object.

Aber ehrlich gesagt verstehe ich das nicht genau. Fakt ist aber, dass das closure nicht an this gebunden wird.

Ja, das habe ich nochmal explizit nachvollzogen, mit fogendem Code:
<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 () {

alert ( '(this===window) in innerer Funktion: ' + (this===window) );

//return this.name;
   return selbst.name;
  }

return meinName();
 }
}
var wer = new Jemand( 'Vulkanier' );
alert( "Hallo " + wer.name +"!" );
alert( "Hallo " + wer.biste() +"!" );

</script>

Wie man sieht, funktioniert "this" in der öffentlichen Variablen "name" und der öffentlichen Methode "biste" des Objekts "Jemand" genau so, wie es sich gehört.
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.

Man kann das Problem eleganter als mit .call() umschiffen, indem man (vorsichtshalber grundsätzlch in jedem Objekt) eine private Variable "selbst" definiert, die dann in inneren Funktionen an Stelle des kaputten "this" benutzt wird.

Ich bin mir nicht sicher, aber ein denkbarer Grund  für dieses unbequeme Verhalten könnte sein, dass die vordefinierten JavaScript-Objekte und Funktionen wie "Object", "String", aber auch "new", "alert" usw. ja alle auch nur Unterobjekte des globalen Objekts sind. Diese werden immer direkt aufgerufen. Wenn "this" auch in einer direkt aufgerufenen Funktion immer auf den aktuellen Kontext verweisen würde, statt auf das globale Objekt, dann würde JavaScript vielleicht seine eigene Sprache nicht mehr verstehen. Ein "irgendwas.alert()" ist ja normalerweise nicht definiert.
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.

Preisfrage:
Welches Statement ist schneller: "window.document" oder nur "document"?

Das ist mir auch schon über den Weg gelaufen, weißt du auch warum?
Die Seiten die ich zu "JS optimization" gefunden habe, empfehlen alle window.document

Nein, "window.document" ist umständlicher, weil "window" lediglich auf das ansonsten namenlose globale Objekt verweist.
Wenn man nur "document" sagt, ist klar, das es eine Eigenschaft oder Methode des globalen Objekts ist. Der Compiler kann sofort dort nachschauen.
Beim Ausdruck "window.document" dagegen sucht der Compiler erst im globalen Objekt nach "window", wird dann erneut auf das globale Objekt verwiesen, wo er erst dann das document-Objekt finden kann.

Gruß, Don P