Tim Tepaße: Namensauflösung in benannten Funktionen

Beitrag lesen

Hallo Mathias,

... arguments.callee.

Das arguments-Objekt wird immer dann neu erstellt, wenn man in eine Funktion reinkommt und callee drangepropft. Heisst: Immer, aber auch immer, wenn das Funktionsobjekt ausgeführt wird. Der Identifier dagegen steht beim ersten Auswerten der Function Expression fest, braucht in einer tiefen Rekursion nicht immer noch zusätzlich Objekte. arguments ist auch nicht wirklich berechenbar, weil eben sehr flexibel. Zusätzlich ist callee auch noch nur { DontEnum } und nicht noch { DontDelete, ReadOnly }, damit kann also rumgewurschtelt werden. Solch eine Unberechenbarkeit etwas steht etwas im Weg, wenn der Interpreter, die VM, der Compiler Optimierungen betreiben wollen, z.B. Tail Call Optimierung, die gerade bei Rekursion es schaffen kann, schon vor der Ausführung die Absicht der vielen den Stack verstopfenden offene Funktions-Ausführungs-Objekte in Schleifenform webzuoptimieren.

Finde ich nicht. Ich halte die Sonderregel für überflüssig und verwirrend. Wieso diese Unterscheidung?

Wohl historisch gewachsen, Named Function Expressions kamen erst in ES 3 dazu. Brendan Eich hat sie meiner Erinnerung nach irgendwo mal als Karotte bezeichnet, mit denen man Programmierer locken wollte. Ich verfolge das nur am Range, aber im ES-Land scheint man durchaus unglücklich mit arguments.callee zu sein. Im Strict-Modus von ES 3.1 soll callee nicht nutzbar sein; im alten ES-4-Vorschlag gab es ein eigenes Keyword mit der ziemlich abstrusen Syntax „this function“ – ja, inklusive Leerzeichen. Was im Projekt der Großen Harmonie damit wird: keine Ahnung.

Übrigens erzeugt eine Function Expression mit Namen im IE eine Variable im aktuellen Scope.

Ja, das wird als Function Declaration verarbeitet. Ist das auch im IE 8 so? Ich hatte die JScript-Jungs bei der Veröffentlichung des Deviation-Papers so verstanden, dass sie diese bekannten Abweichungen eigentlich reparieren wollten.

Tim