Wie lautet der Name meiner namenlosen „Funktion“ in JavaScript?JavaScript

Javascript-Forum
Anonymous
 Wie lautet der Name meiner namenlosen „Funktion“ in JavaScript?

Post by Anonymous »

Okay, lassen Sie mich zunächst einige Fakten darlegen, dann kommt meine Frage.
Funktionen in JavaScript können optional selbst Namen haben:
  • Code: Select all

    (function f1() {}).name
    ergibt 'f1', da die Funktion einen Namen hat, wenn sie deklariert wird.
  • Code: Select all

    (function () {}).name
    ergibt „“, weil die Funktion bei der Deklaration keinen Namen hat.
So weit, so gut.
  • Code: Select all

    var f2 = function f3(); f2.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.
Noch einmal, soweit, so gut.
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.
  • Code: Select all

    var f4 = (function() {}); f4.name
    ergibt „f4“ (runde Klammern sind hier optional und werden nur zur besseren Lesbarkeit eingefügt)
Das macht allmählich keinen Sinn mehr, da das Ding auf der rechten Seite des Zuweisungsoperators offensichtlich keinen Namen hat, aber nachdem die Zuweisung abgeschlossen wurde, hat es jetzt wie von Zauberhand einen, und der Name ist irgendwie von demselben „lokalen Namen“ entlehnt, dem das zuweisbare Ding (die Funktion) zugewiesen wurde
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“):
  • Code: Select all

    var o5 = {f5: function () {}}; o5.f5.name
    ergibt „f5“
  • Code: Select all

    var o6 = {['']: function (){}}; o6[''].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)
ABER
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:
  • Code: Select all

    var f7 = (() => (function () {}))(); f7.name
    ergibt „“, obwohl die namenlose rechtsseitig ausgewertete Ausdrucksfunktion einem Namen zugewiesen wurde (

    Code: Select all

    f7
    )
Dies gilt auch für die Wörterbuchindexsyntax:
  • Code: Select all

    var o8 = {f8a: (() => (function () {}))()}; o8.f8a.name
    ergibt „“
Und in
  • Code: Select all

    var o9 = {['']: (() => (function () {}))()}; o9[''].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).
Was ist also die genaue Regel, die JS-Engines einhalten müssen, wenn es darum geht, einer (ursprünglich) namenlosen Funktion einen Namen zuzuweisen oder nicht?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post