Ich habe das:
this.f = function instance(){};
Ich hätte gerne folgendes:
this.f = function ["instance:" + a](){};
javascript
function
Totty.js
quelle
quelle
this["instance"] = function() { }
this["instance" + a] = function() { }
. Das war mir nicht klar.Antworten:
aktualisieren
Wie bereits erwähnt, ist dies weder die schnellste noch die am meisten empfohlene Lösung. Die unten stehende Lösung von Marcosc ist der richtige Weg.
Sie können eval verwenden:quelle
eval()
(derFunction
Konstruktor macht das im Inneren).Dies wird es im Grunde auf der einfachsten Ebene tun:
Wenn Sie mehr Lust haben möchten, habe ich einen Artikel über " Dynamische Funktionsnamen in JavaScript " geschrieben.
quelle
eval
das Javascript auswertet und so Ihren Code für eine Reihe von Sicherheitslücken öffnet.Sie können Object.defineProperty wie in der MDN-JavaScript-Referenz [1] angegeben verwenden:
quelle
function fn()
,fn
wird sie gedruckt und ist der ursprüngliche Name. Seltsam.In neueren Motoren können Sie dies tun
quelle
Object.defineProperty(func, 'name', {value: name})
meinen eigenen Code zu verwenden, da ich denke, dass er vielleicht etwas natürlicher und verständlicher ist.{[expr]: val}
ein Objektinitialisierer (wie auch ein JSON-Objekt), in demexpr
sich ein Ausdruck befindet. Was auch immer es auswertet, ist der Schlüssel.{myFn (..){..} }
ist eine Abkürzung für{myFn: function myFn(..){..} }
. Beachten Sie, dassfunction myFn(..) {..}
ein Ausdruck wie eine anonyme Funktion verwendet werden kann und nurmyFn
einen Namen hat. Der letzte[name]
ist nur der Zugriff auf das Mitglied des Objekts (genau wieobj.key
oderobj['key']
)....
ist der Spread-Operator. (Hauptquelle: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )this
. Zum Beispielobj={x:7,getX(){return this.x}}; obj.getX=nameFunction('name',obj.getX); obj.getX();
wird nicht funktionieren. Sie können Ihre Antwort bearbeiten undfunction nameFunction(name, body) { return {[name](...args) {return body.apply(this, args)}}[name] }
stattdessen verwenden!Ich denke, die meisten Vorschläge hier sind suboptimal, indem evale, hackige Lösungen oder Wrapper verwendet werden. Ab ES2015 werden Namen aus der syntaktischen Position für Variablen und Eigenschaften abgeleitet.
Das wird also gut funktionieren:
Widerstehen Sie der Versuchung, benannte Funktionsfactory-Methoden zu erstellen, da Sie die Funktion nicht von außen übergeben und an der syntaktischen Position nachrüsten können, um auf ihren Namen zu schließen. Dann ist es schon zu spät. Wenn Sie das wirklich brauchen, müssen Sie einen Wrapper erstellen. Jemand hat das hier gemacht, aber diese Lösung funktioniert nicht für Klassen (die auch Funktionen sind).
Eine ausführlichere Antwort mit allen beschriebenen Varianten wurde hier geschrieben: https://stackoverflow.com/a/9479081/633921
quelle
Die Syntax
function[i](){}
impliziert ein Objekt mit Eigenschaftswerten, bei denen es sich um Funktionen handeltfunction[]
, die durch den Namen indiziert sind[i]
.Also
{"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]
behält die Identifizierung des Funktionsnamens bei. Siehe Anmerkungen unten bezüglich:
.So,
wird
({f:(function () {})})
in FireFox angezeigt.(Dies ist fast die gleiche Idee wie bei dieser Lösung , nur dass ein generisches Objekt verwendet wird und das Fensterobjekt nicht mehr direkt mit den Funktionen gefüllt wird.)
Diese Methode füllt die Umgebung explizit mit
instance:x
.Anzeigen
und
Obwohl die Eigenschaftsfunktion
f
auf einanonymous function
und nicht verweistinstance:x
, vermeidet diese Methode mehrere Probleme mit dieser Lösung .wird nur angezeigt
:
macht das Javascriptfunction instance:a(){}
ungültig.eval
.Das Folgende ist nicht unbedingt problematisch,
instanceA
Funktion steht nicht direkt zur Verfügung alsinstanceA()
und ist daher viel konsistenter mit dem ursprünglichen Problemkontext.
Angesichts dieser Überlegungen
pflegt die globale Computerumgebung so weit wie möglich mit der Semantik und Syntax des OP-Beispiels.
quelle
(name => ({[name]:function(){}})[name])('test')
funktioniert,(name => {var x={}; x[name] = function(){}; return x[name];})('test')
aber nichtDie am häufigsten gewählte Antwort hat bereits den Funktionskörper [String] definiert. Ich suchte nach einer Lösung, um den Namen der bereits deklarierten Funktion umzubenennen, und schließlich habe ich mich nach einer Stunde des Kampfes damit befasst. Es:
.toString()
Methode in [String]function
und an(
new Function()
Konstruktor erstelltquelle
Wie wäre es mit
Der einzige Nachteil ist, dass die Funktion in ihrer toSource-Methode keinen Namen angibt. Das ist normalerweise nur ein Problem für Debugger.
quelle
Dynamische Methoden eines Objekts können mit den von ECMAScript 2015 (ES6) bereitgestellten Object Literal Extensions erstellt werden:
Die Ausgabe des obigen Codes lautet:
quelle
o={}; o[name]=(()=>{})
anstattfunction <<name>>(){}
So legen Sie den Namen einer vorhandenen anonymen Funktion fest:
(Basierend auf der Antwort von @ Marcosc)
Demo .
Hinweis : Tu es nicht; /
quelle
Es gibt zwei Methoden, um dies zu erreichen, und sie haben ihre Vor- und Nachteile.
name
EigenschaftsdefinitionDefinieren unveränderliche
name
Eigenschaft einer Funktion.Vorteile
() 全 {}/1/얏호/ :D #GO(@*#%! /*
)Nachteile
name
Eigenschaftswert.Bewertung des Funktionsausdrucks
Einen Namen Funktion Ausdruck und Auswertung mit
Function
Konstruktor.Vorteile
name
Eigenschaftswert.Nachteile
(){}/1//
der Ausdruck istreturn function (){}/1//() {}
, gibtNaN
statt einer Funktion.).quelle
Wenn Sie eine dynamische Funktion wie die
__call
Funktion in PHP haben möchten , können Sie Proxies verwenden.quelle
Sie können den Namen der dynamischen Funktion und solche Parameter verwenden.
1) Funktion Separate definieren und aufrufen
2) Funktionscode dynamisch definieren
quelle
Vielen Dank, Marcosc! Wenn Sie auf seiner Antwort aufbauen und eine Funktion umbenennen möchten, verwenden Sie Folgendes :
quelle
Diese Dienstprogrammfunktion führt mehrere Funktionen zu einer zusammen (unter Verwendung eines benutzerdefinierten Namens). Die einzige Voraussetzung ist, dass die bereitgestellten Funktionen zu Beginn und am Ende des Bereichs ordnungsgemäß "neu gezeichnet" werden.
quelle
Ich hatte besseres Glück, Darrens Antwort und Kyernetikos 'Antwort zu kombinieren .
Hinweis:
configurable
wird auftrue
die Standard - ES2015 - Spezifikation für Function.name passen 1Dies vor allem dazu beigetragen , in immer einen Fehler in Webpack ähnlich wie um diesen .
Update: Ich habe darüber nachgedacht, dies als npm-Paket zu veröffentlichen, aber dieses Paket von sindresorhus macht genau das Gleiche.
quelle
Ich hatte viel mit diesem Problem zu kämpfen. Die @ Albin-Lösung funktionierte während der Entwicklung wie ein Zauber, aber sie funktionierte nicht, als ich sie auf Produktion umstellte. Nach einigem Debuggen wurde mir klar, wie ich das erreichen konnte, was ich brauchte. Ich verwende ES6 mit CRA (Create-React-App), was bedeutet, dass es von Webpack gebündelt wird.
Nehmen wir an, Sie haben eine Datei, die die Funktionen exportiert, die Sie benötigen:
myFunctions.js
Und Sie müssen diese Funktionen an anderer Stelle dynamisch aufrufen:
myApiCalls.js
quelle
Am besten erstellen Sie ein Objekt mit einer Liste dynamischer Funktionen wie:
quelle
quelle
Ich vermisse hier vielleicht das Offensichtliche, aber was ist falsch daran, nur den Namen hinzuzufügen? Funktionen werden unabhängig von ihrem Namen aufgerufen. Namen werden nur aus Gründen des Geltungsbereichs verwendet. Wenn Sie es einer Variablen zuweisen und es sich im Gültigkeitsbereich befindet, kann es aufgerufen werden. Was passiert, ist, dass Sie eine Variable ausführen, die zufällig eine Funktion ist. Wenn Sie beim Debuggen aus Identifikationsgründen einen Namen haben müssen, fügen Sie ihn zwischen der Schlüsselwortfunktion und der öffnenden Klammer ein.
Ein alternativer Ansatz besteht darin, die Funktion in einen äußeren umbenannten Shim zu verpacken, den Sie auch in einen äußeren Wrapper übergeben können, wenn Sie den umgebenden Namespace nicht verschmutzen möchten. Wenn Sie die Funktion tatsächlich dynamisch aus Zeichenfolgen erstellen möchten (was in den meisten dieser Beispiele der Fall ist), ist es trivial, die Quelle umzubenennen, um das zu tun, was Sie möchten. Wenn Sie jedoch vorhandene Funktionen umbenennen möchten, ohne deren Funktionalität zu beeinträchtigen, wenn Sie an anderer Stelle aufgerufen werden, ist ein Shim der einzige Weg, dies zu erreichen.
quelle
name
ist nützlich, da sie jetzt aus Variablen und Eigenschaften abgeleitet wird. Es wird auch in Stapelspuren verwendet. Bspvar fn = function(){}; console.log(fn.name)
. Es ist unveränderlich, so dass Sie es später nicht ändern können. Wenn Sie eine Factory-Methode schreiben, die alle Funktionen benennt,fn
wird das Debuggen dadurch schwieriger.Sie waren in der Nähe:
{...};
quelle
Dies ist die beste Lösung, besser dann
new Function('return function name(){}')()
.Eval ist die schnellste Lösung:
quelle