Dynamischer Funktionsname in Javascript?
Habe ich dieses:
this.f = function instance(){};
Ich würde gern diesen:
this.f = function ["instance:" + a](){};
InformationsquelleAutor der Frage Totty.js | 2011-05-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
update
Wie andere erwähnt haben, dies ist nicht die Schnellste, noch die am meisten empfohlene Lösung. Marcosc die Lösung unten ist der Weg zu gehen.
Man kann mit eval:InformationsquelleAutor der Antwort Mo Valipour
Wird dies im Grunde tun, ist es am einfachsten level:
Wenn Sie möchten, um mehr Lust, ich habe einen Artikel geschrieben über "Dynamische Funktionsnamen in JavaScript".
InformationsquelleAutor der Antwort Marcosc
Können Sie mit dem Objekt.defineProperty wie bereits in der MDN-JavaScript-Referenz [1]:
InformationsquelleAutor der Antwort Darren
Die syntax
function[i](){}
impliziert ein Objekt mit Eigenschaftswerten, die Funktionenfunction[]
indiziert durch den Namen, die[i]
.Somit
{"f:1":function(){}, "f:2":function(){}, "f:A":function(){}, ... } ["f:"+i]
.{"f:1":function f1(){}, "f:2":function f2(){}, "f:A":function fA(){}} ["f:"+i]
wird die Erhaltung der Funktion name. Siehe Hinweise unten bezüglich:
.So,
zeigt
({f:(function () {})})
im FireFox.(Das ist fast die gleiche Idee wie diese Lösung, nur es verwendet ein generisches Objekt und nicht mehr direkt füllt das Fenster-Objekt mit den Funktionen.)
Diese Methode explizit füllt die Umgebung mit
instance:x
.zeigt
und
Obwohl die-Eigenschaft-Funktion
f
verweist auf einanonymous function
und nichtinstance:x
diese Methode vermeidet einige Probleme mit diese Lösung.zeigt nur
:
macht die javascript -function instance:a(){}
ungültig.eval
.Folgende ist nicht unbedingt problematisch,
instanceA
- Funktion ist nicht direkt für die Verwendung alsinstanceA()
ist und damit viel mehr im Einklang mit dem ursprünglichen problem-Kontext.
Angesichts dieser überlegungen,
unterhält die Globale computing-Umgebung mit der Semantik und syntax der OP Beispiel so viel wie möglich.
InformationsquelleAutor der Antwort Ekim
Zur Einstellung den Namen eines bestehenden anonyme Funktion:
(Basierend auf @Marcosc Antwort)
Demo.
InformationsquelleAutor der Antwort Onur Yıldırım
Was
Der einzige Nachteil ist, dass die Funktion in Ihrem toSource-Methode würde nicht geben Sie einen Namen. Das ist in der Regel nur ein problem für den Debugger.
InformationsquelleAutor der Antwort entonio
Dynamische Methoden eines Objekts erstellt werden können, mit dem Objekt-Literal Erweiterung von ECMAScript 2015 (ES6):
Die Ausgabe von der Ausführung des Codes oben:
InformationsquelleAutor der Antwort Luke Schoen
Ich denke, die meisten Vorschläge hier sind suboptimal, durch die Verwendung von eval, hacky-Lösungen oder Wrapper.
Als der ES2015 Namen sind abgeleitet von der syntaktischen position der Variablen und Eigenschaften.
So, das wird funktionieren just fine:
Widerstehen Sie der Versuchung, zu erstellen benannte Funktion factory-Methoden, wie Sie nicht in der Lage sein, um übergeben, die Funktion von außen-und retrofit-in der syntaktischen position zu schließen, seinen Namen. Dann ist es bereits zu spät. Wenn Sie wirklich brauchen, müssen Sie zum erstellen eines wrappers. Jemand hat das hier, aber diese Lösung funktioniert nicht bei Klassen (auch mit Funktionen).
Sehr viel mehr in die Tiefe zu beantworten, mit allen Varianten skizziert wurde hier geschrieben: https://stackoverflow.com/a/9479081/633921
InformationsquelleAutor der Antwort Albin
Danke Marcosc! Aufbauend auf seine Antwort, wenn Sie umbenennen möchten alle - Funktion, verwenden Sie diese:
InformationsquelleAutor der Antwort B T
Diese utility-Funktion, Zusammenführen mehrerer Funktionen in einem (mit einem benutzerdefinierten Namen), einzige Voraussetzung ist, dass die bereitgestellten Funktionen sind richtig "neu gefüttert" zu Beginn und Ende seiner Schaufel.
InformationsquelleAutor der Antwort MetalGodwin
Gibt es zwei Methoden, um dies zu erreichen, und Sie haben Ihre vor-und Nachteile.
name
Eigenschaft definitionDefinieren unveränderlich
name
Eigenschaft einer Funktion.Vor -
() 全 {}/1/얏호/:D #GO(@*#%! /*
)Nachteile
name
- Eigenschaft-Wert.Funktion Auswertung eines Ausdrucks
Machen eine namens Funktion Ausdruck und Bewertung es mit
Function
Konstruktor.Vor -
name
- Eigenschaft-Wert.Nachteile
(){}/1//
der Ausdruck istreturn function (){}/1//() {}
gibtNaN
anstelle der Funktion.).InformationsquelleAutor der Antwort K._
InformationsquelleAutor der Antwort Danilo Colasso
Dies ist die BESTE Lösung, besser als
new Function('return function name(){}')()
.Eval ist die Schnellste Lösung:
InformationsquelleAutor der Antwort Maxmaxmaximus