Funktionen in JavaScript können optional selbst Namen haben:
- ergibt 'f1', da die Funktion einen Namen hat, wenn sie deklariert wird.
Code: Select all
(function f1() {}).name - ergibt „“, weil die Funktion bei der Deklaration keinen Namen hat.
Code: Select all
(function () {}).name
- ergibt „f3“, da der Funktionsname durch Betrachtung der benannten Funktion bestimmt wurde, die f2 zugewiesen wurde (die eigentlich nur „ein Name“ ist und auf das Funktionsobjekt „zeigt“, das durch die Auswertung des Ausdrucks auf der rechten Seite erstellt wurde), also f3 selbst.
Code: Select all
var f2 = function f3(); f2.name
Wenn Sie auf der rechten Seite eine namenlose Funktion haben (ausgewerteter Ausdruck) wie in Beispiel 2. oben, und Sie geben ihm sofort *1 einen Namen, die Funktion hätte dann jedoch einen Namen.
- ergibt „f4“ (runde Klammern sind hier optional und werden nur zur besseren Lesbarkeit eingefügt)
Code: Select all
var f4 = (function() {}); f4.name
Man würde nun sagen, dass JS einer namenlosen Funktion immer dann einen Namen zuweist, wenn (die namenlose Funktion) zufällig einem lokalen Namen zugewiesen wird, und dies würde auch gelten, wenn es um die unmittelbare Zuweisung einer namenlosen Funktion zu anderen „benannten“ Dingen geht (wie einer „benannten Zuordnung“, also „einem Wörterbuch“):
- ergibt „f5“
Code: Select all
var o5 = {f5: function () {}}; o5.f5.name - ergibt „“ (vielleicht weil die Funktion namenlos ist oder weil sie dem leeren String mit dem Namen index in o6 Wörterbuch/Objekt zugewiesen wurde, ich schätze, wir werden es nie erfahren)
Code: Select all
var o6 = {['']: function (){}}; o6[''].name
Wenn Ihr namenloser Ausdruck nicht sofort vom Syntaxparser erkannt werden kann (und tatsächlich eine II[N]Fauswerten muss (sofort aufgerufene [namenlose] Funktion), dann wird der Name des zugewiesenen „lokalen Namens“ nicht automatisch an die rechtsseitig ausgewertete namenlose Funktion weitergegeben:
- ergibt „“, obwohl die namenlose rechtsseitig ausgewertete Ausdrucksfunktion einem Namen zugewiesen wurde (
Code: Select all
var f7 = (() => (function () {}))(); f7.name)Code: Select all
f7
- ergibt „“
Code: Select all
var o8 = {f8a: (() => (function () {}))()}; o8.f8a.name
- ergibt „“ (vielleicht wiederum, weil die Funktion namenlos ist oder weil sie dem leeren String mit dem Namen index in o6 Wörterbuch/Objekt zugewiesen wurde, wir werden es auch nie erfahren).
Code: Select all
var o9 = {['']: (() => (function () {}))()}; o9[''].name
Mobile version