Wie kann ich innerhalb dieser Funktion auf einen Funktionsnamen zugreifen?
// parasitic inheritance
var ns.parent.child = function() {
var parent = new ns.parent();
parent.newFunc = function() {
}
return parent;
}
var ns.parent = function() {
// at this point, i want to know who the child is that called the parent
// ie
}
var obj = new ns.parent.child();
javascript
function
Scott Klarenbach
quelle
quelle
Antworten:
In ES5 ist das Beste:
Die Verwendung
Function.caller
ist nicht Standard.Function.caller
undarguments.callee
sind beide im strengen Modus verboten.Bearbeiten: Die unten auf Regex basierende Antwort von nus erreicht dasselbe, hat aber eine bessere Leistung!
In ES6 können Sie nur verwenden
myFunction.name
.Hinweis: Beachten Sie, dass einige JS-Minifizierer möglicherweise Funktionsnamen wegwerfen, um eine bessere Komprimierung zu erzielen. Möglicherweise müssen Sie ihre Einstellungen anpassen, um dies zu vermeiden.
quelle
fun.toString().substr(0, 100)
Was für meine Bedürfnisse ausreicht, um die betreffende Funktion zu lokalisieren. Also, danke für die Inspiration!myFunction.name
ist das Beste, was man in ES6 machen kann.myFunction.name
wenn Sie den Funktionsnamen eingeben? besiegt den Zweck von magischen Variablen.arr[index].name
wird auch funktionieren :)myFunction.name
wird sie ebenfalls aktualisiert. Sicher, IntelliJ unterstützt das Umbenennen von Bezeichnern innerhalb von Zeichenfolgen, aber das funktioniert viel weniger konsistent und wird stillschweigend veraltet, wenn jemand vergisst, die Option "In Zeichenfolgen suchen" anzukreuzen.myFunction.name
ist eine etwas bessere Wahl als die Hardcodierung der Zeichenfolge.ES6 (inspiriert von der Antwort von sendy halim unten):
Erläuterung zu MDN . Ab 2015 funktioniert in NodeJS und allen gängigen Browsern außer IE.
Hinweis: Bei gebundenen Funktionen ergibt dies "
bound <originalName>
". Sie müssen die "Bindung" entfernen, wenn Sie den ursprünglichen Namen erhalten möchten.ES5 (inspiriert von Vlads Antwort):
Wenn Sie einen Verweis auf die Funktion haben, können Sie Folgendes tun:
caller
undcallee
gelten als veraltet.[1] Ich füge es hier ein, weil es legal ist und häufig genug Syntaxhervorhebungswerkzeuge den Leerraum zwischen Funktionsname und Klammer nicht berücksichtigen. Andererseits ist mir keine Implementierung von .toString () bekannt, die hier Leerzeichen enthält. Deshalb können Sie sie weglassen.
Als Antwort auf die ursprüngliche Frage würde ich die parasitäre Vererbung fallen lassen und mich für einige traditionellere OOP-Entwurfsmuster entscheiden. Ich habe ein TidBits.OoJs geschrieben, um bequem OOP-Code in JavaScript mit einem Funktionssatz zu schreiben, der C ++ nachahmt (noch nicht vollständig, aber meistens).
Ich sehe aus den Kommentaren, dass Sie vermeiden möchten, dass Informationsbedürfnisse
parent
an den Konstruktor weitergegeben werden. Ich muss zugeben, dass traditionelle Entwurfsmuster Sie jedoch nicht davor bewahren werden, da es im Allgemeinen als eine gute Sache angesehen wird, Ihre Abhängigkeiten offensichtlich zu machen und durchzusetzen.Ich würde auch vorschlagen, sich von anonymen Funktionen fernzuhalten. Sie machen das Debuggen und Profilieren einer PITA nur, weil alles nur als "anonyme Funktion" angezeigt wird und es keinen Nutzen für sie gibt, den ich kenne.
quelle
.name
Eigenschaft einer Komponentenmethode wurde als Zeichenfolge "Wert" angezeigt, unabhängig davon, wie sie aufgerufen wurde. Seltsamerweise war es beim Testen in der Expo-App in Ordnung, aber sobald es zu einer echten Anwendung kompiliert wurde, stürzte es lautlos ab.Sie weisen einer Variablen eine unbenannte Funktion zu. Sie benötigen wahrscheinlich stattdessen einen benannten Funktionsausdruck ( http://kangax.github.com/nfe/ ).
Ich bin mir jedoch nicht sicher, wie viel browserübergreifend das ist. Es gibt ein Problem mit IE6, bei dem der Name der Funktion in den äußeren Bereich gelangt. Außerdem ist argument.callee veraltet und führt zu Fehlern, wenn Sie verwenden
strict mode
.quelle
Any
constructor
macht eine Eigenschaft verfügbarname
, bei der es sich um den Funktionsnamen handelt. Sie greifenconstructor
über eine Instanz (usingnew
) oder eineprototype
:quelle
console.log
Anruf protokolliertwindow
oderObject
für mich je nachdem, wo ich ihn ausführe, nichtPerson
.Dies könnte für Sie funktionieren:
Wenn Sie foo () ausführen, wird "foo" oder undefiniert ausgegeben, wenn Sie von einer anonymen Funktion aus aufrufen.
Es funktioniert auch mit Konstruktoren. In diesem Fall wird der Name des aufrufenden Konstruktors ausgegeben (z. B. "Foo").
Weitere Informationen finden Sie hier: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Caller
Sie behaupten, es sei nicht Standard, aber es werde auch von allen gängigen Browsern unterstützt: Firefox, Safari, Chrome, Opera und IE.
quelle
Es sieht aus wie das Dümmste, was ich in meinem Leben geschrieben habe, aber es ist lustig: D.
d
- Stapeltiefe.0
- diesen Funktionsnamen zurückgeben,1
- Eltern usw.;[0 + d]
- nur zum Verständnis - was passiert;firefoxMatch
- arbeitet für eine Safari, aber ich hatte wirklich ein wenig Zeit zum Testen, weil Macs Besitzer nach dem Rauchen zurückgekehrt war und mich weggefahren hat: '(Testen:
Ergebnis:
Chrome:
Fitefox:
Diese Lösung wurde nur zum Spaß erstellt ! Verwenden Sie es nicht für echte Projekte. Es hängt nicht von der ES-Spezifikation ab, sondern nur von der Browser-Realisierung. Nach dem nächsten Chrome / Firefox / Safari-Update ist es möglicherweise defekt.
Darüber hinaus gibt es keine Fehlerverarbeitung (ha). Wenn
d
die Stapellänge größer als die Stapellänge ist, wird ein Fehler angezeigt.Für das Messaage-Muster anderer Wrowser-Fehler wird ein Fehler angezeigt.
Es muss für ES6-Klassen (
.split('.').pop()
) funktionieren , aber Sie können immer noch einen Fehler bekommen;quelle
Das kannst du nicht. Funktionen haben keine standardmäßigen Namen (obwohl Mozilla ein solches Attribut hat) - sie können nur Variablen mit Namen zugewiesen werden.
Auch dein Kommentar:
befindet sich in der Funktion my.namespace.myFunc.getFn
Sie können den Konstruktor eines von new erstellten Objekts zurückgeben
Man könnte also sagen
quelle
Sie können dies für Browser verwenden, die Error.stack unterstützen (wahrscheinlich nicht fast alle).
Dies gilt natürlich für die aktuelle Funktion, aber Sie haben die Idee.
glücklich sabbern, während Sie codieren
quelle
Sie können die
name
Eigenschaft verwenden, um den Funktionsnamen abzurufen, es sei denn, Sie verwenden eine anonyme FunktionBeispielsweise:
Versuchen wir es jetzt mit der benannten Funktion
Jetzt können Sie verwenden
quelle
Sie können den Konstruktornamen wie folgt verwenden:
Dieser Code gibt einfach den Namen einer Methode zurück.
quelle
als Teil, wie
ECMAScript 6
Sie die Function.name- Methode verwenden könnenquelle
Sie könnten verwenden
Function.name
:In den meisten Implementierungen von JavaScript können Sie, sobald Sie die Referenz Ihres Konstruktors im Gültigkeitsbereich haben, den Zeichenfolgennamen aus der Namenseigenschaft abrufen (z. B. Function.name oder Object.constructor.name)
Sie könnten verwenden
Function.callee
:Die native
arguments.caller
Methode ist veraltet, wird jedoch von den meisten Browsern unterstütztFunction.caller
, die das tatsächlich aufrufende Objekt (seinen Code) zurückgeben: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ Funktion / Aufrufer? Redirectlocale = de-US & redirectslug = JavaScript% 2FReference% 2FGlobal_Objects% 2FFunction% 2FcallerSie könnten eine Quellkarte erstellen :
Wenn Sie die Literalfunktionssignatur (den "Namen") und nicht das Objekt selbst benötigen, müssen Sie möglicherweise auf etwas Anpassungsfähigeres zurückgreifen, z. B. das Erstellen einer Array-Referenz der API-Zeichenfolgenwerte, die Sie benötigen häufig zugreifen. Sie können sie mithilfe von
Object.keys()
und Ihrer Zeichenfolge zusammen zuordnen oder in der Quellzuordnungsbibliothek von Mozilla auf GitHub nach größeren Projekten suchen: https://github.com/mozilla/source-mapquelle
Ich weiß, dass dies eine alte Frage ist, aber in letzter Zeit hatte ich ein ähnliches Problem, als ich versuchte, die Methoden einiger React Component für Debugging-Zwecke zu dekorieren. Wie bereits gesagt,
arguments.caller
undarguments.callee
im strengen Modus verboten, der wahrscheinlich standardmäßig in Ihrem React-Transpiling aktiviert ist. Sie können es entweder deaktivieren oder ich konnte einen anderen Hack entwickeln, da in React alle Klassenfunktionen benannt sind. Sie können dies tatsächlich tun:quelle
Das hat bei mir funktioniert.
Testcode:
quelle
Ich hatte ein ähnliches Problem und löste es wie folgt:
Dieser Code implementiert auf bequemere Weise eine Antwort, die ich hier oben in dieser Diskussion bereits gelesen habe. Jetzt habe ich eine Mitgliedsfunktion, die den Namen eines Funktionsobjekts abruft. Hier ist das vollständige Skript ...
quelle
Wenn ich verstanden habe, was Sie tun wollten, ist dies das, was ich in einem Funktionskonstruktor tue.
quelle
Dies funktioniert in ES5, ES6, allen Browsern und strengen Modusfunktionen.
So sieht es mit einer benannten Funktion aus.
So sieht es mit einer anonymen Funktion aus.
quelle
at myName (<anonymous>:2:15)
Firefox:@debugger eval code:3:3
Schauen Sie hier: http://www.tek-tips.com/viewthread.cfm?qid=1209619
scheint für Ihre Bedürfnisse richtig zu sein.
quelle
Mit Error.stack können Sie den Funktionsnamen und die genaue Position Ihrer Position verfolgen.
Siehe stacktrace.js
quelle
Einfacher Weg, um den Funktionsnamen aus der Funktion heraus zu ermitteln, die Sie ausführen.
quelle
this
grundsätzlich alles sein kann. versuchen(function(){console.log(this.name);}).bind({name: "put basically anything here even an object maybe a 1TB string maybe a class definition"})()