function main()
{
Hello();
}
function Hello()
{
// How do you find out the caller function is 'main'?
}
Gibt es eine Möglichkeit, den Aufrufstapel herauszufinden?
javascript
callstack
Ray Lu
quelle
quelle
Antworten:
Beachten Sie, dass diese Funktion nicht-Standard , aus
Function.caller
:Das Folgende ist die alte Antwort aus dem Jahr 2008, die im modernen Javascript nicht mehr unterstützt wird:
quelle
arguments.callee.caller.name
erhält den Namen der Funktion.'use strict';
könnte also helfen.arguments
Auf CAN kann innerhalb einer Funktion im strengen Modus zugegriffen werden. Es wäre dumm, dies zu verwerfen. nur nicht von function.arguments von außen. Wenn Sie ein benanntes Argument haben, verfolgt die Argumentform [i] keine Änderungen, die Sie an der benannten Version innerhalb der Funktion vorgenommen haben.StackTrace
Sie können den gesamten Stack-Trace mit browserspezifischem Code finden. Das Gute ist, dass jemand es bereits geschafft hat ; Hier ist der Projektcode auf GitHub .
Aber nicht alle Nachrichten sind gut:
Es ist sehr langsam, den Stack-Trace zu erhalten. Seien Sie also vorsichtig (lesen Sie dies für weitere Informationen).
Sie müssen Funktionsnamen definieren, damit die Stapelverfolgung lesbar ist. Denn wenn Sie Code wie diesen haben:
Google Chrome benachrichtigt Sie,
... kls.Hello ( ...
aber die meisten Browser erwarten einen Funktionsnamen direkt nach dem Keywordfunction
und behandeln ihn als anonyme Funktion. Ein nicht einmal Chrome kann denKlass
Namen verwenden, wenn Sie den Namen nicht angebenkls
der Funktion .Übrigens können Sie die Option an die Funktion printStackTrace übergeben,
{guess: true}
aber ich habe dadurch keine wirkliche Verbesserung festgestellt .Nicht alle Browser geben Ihnen die gleichen Informationen. Das heißt, Parameter, Codespalte usw.
Name der Anruferfunktion
Übrigens, wenn Sie nur den Namen der Anruferfunktion (in den meisten Browsern, aber nicht im Internet Explorer) möchten, können Sie Folgendes verwenden:
Beachten Sie jedoch, dass dieser Name nach dem
function
Schlüsselwort steht. Ich habe keine Möglichkeit gefunden (auch nicht bei Google Chrome), mehr zu erreichen, ohne den Code der gesamten Funktion zu erhalten.Funktionscode des Anrufers
Und die restlichen besten Antworten zusammenfassen (von Pablo Cabrera, Nourdine und Greg Hewgill). Die einzige browserübergreifende und wirklich sichere Sache, die Sie verwenden können, ist:
Welches zeigt den Code der Anruferfunktion. Leider reicht mir das nicht aus, und deshalb gebe ich Ihnen Tipps für die StackTrace und die Aufruferfunktion Name (obwohl sie nicht browserübergreifend sind).
quelle
Function.caller
per @ Gregs AntwortFunction.caller
funktioniert jedoch nicht im strengen Modus.Ich weiß, dass Sie "in Javascript" erwähnt haben, aber wenn der Zweck das Debuggen ist, ist es meiner Meinung nach einfacher, nur die Entwicklertools Ihres Browsers zu verwenden. So sieht es in Chrome aus: Legen Sie einfach den Debugger dort ab, wo Sie den Stapel untersuchen möchten.
quelle
Um es noch einmal zusammenzufassen (und klarer zu machen) ...
dieser Code:
ist gleichbedeutend damit:
Das erste Bit ist eindeutig portabler, da Sie den Namen der Funktion ändern können, beispielsweise von "Hallo" in "Ciao", und trotzdem das Ganze zum Laufen bringen können.
In letzterem Fall müssten Sie alle Vorkommen ändern, wenn Sie den Namen der aufgerufenen Funktion (Hallo) umgestalten möchten :(
quelle
Sie können die vollständige Stapelverfolgung erhalten:
Bis der Anrufer ist
null
.Hinweis: Es verursacht eine Endlosschleife für rekursive Funktionen.
quelle
Ich benutze normalerweise
(new Error()).stack
in Chrome. Das Schöne ist, dass Sie dadurch auch die Zeilennummern erhalten, unter denen der Anrufer die Funktion aufgerufen hat. Der Nachteil ist, dass es die Länge des Stapels auf 10 begrenzt, weshalb ich überhaupt auf diese Seite gekommen bin.(Ich verwende dies, um Callstacks in einem Konstruktor auf niedriger Ebene während der Ausführung zu sammeln, um sie später anzuzeigen und zu debuggen. Das Festlegen eines Haltepunkts ist daher nicht hilfreich, da er tausende Male getroffen wird.)
quelle
'use strict';
ist. Hat mir die Infos gegeben, die ich brauchte - danke!Wenn Sie es nicht in IE <11 ausführen möchten, ist console.trace () geeignet .
quelle
Sie können Function.Caller verwenden, um die aufrufende Funktion abzurufen. Die alte Methode mit argument.caller gilt als veraltet.
Der folgende Code veranschaulicht seine Verwendung:
Hinweise zu veraltetem argument.caller: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/caller
Beachten Sie, dass Function.caller kein Standard ist: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller
quelle
Cannot access caller property of a strict mode function
Ich würde das tun:
quelle
quelle
arguments.callee.caller.toString()
Es ist sicherer zu verwenden,
*arguments.callee.caller
daarguments.caller
es veraltet ist ...quelle
arguments.callee
wird auch in ES5 nicht mehr unterstützt und im strengen Modus entfernt.arguments.callee
war eine schlechte Lösung für ein Problem, das jetzt besser gelöst wurde. Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Sieht so aus, als wäre dies eine ziemlich gelöste Frage, aber ich habe kürzlich herausgefunden, dass Angerufene im "strengen Modus" nicht erlaubt sind. Deshalb habe ich für meinen eigenen Gebrauch eine Klasse geschrieben, die den Pfad erhält, von dem aus sie aufgerufen wird. Es ist Teil einer kleinen Hilfsbibliothek. Wenn Sie den Code Standalone verwenden möchten, ändern Sie den Offset, der zum Zurückgeben der Stapelverfolgung des Aufrufers verwendet wird (verwenden Sie 1 anstelle von 2).
quelle
function a(){ function b(){ function c(){ return ScriptPath(); } return c(); } return b(); } a()
in der Konsole (habe es nicht in einer Datei versucht), scheint aber eine vernünftige Idee zu haben. Sollte aus Gründen der Sichtbarkeit ohnehin positiv bewertet werden.Versuchen Sie, darauf zuzugreifen:
quelle
Protokollieren Sie einfach Ihren Fehlerstapel auf der Konsole. Sie können dann wissen, wie Sie angerufen werden
quelle
Verwenden Sie sowohl im ES6- als auch im Strict-Modus Folgendes, um die Anruferfunktion zu erhalten
Bitte beachten Sie, dass die obige Zeile eine Ausnahme auslöst, wenn kein Aufrufer oder kein vorheriger Stapel vorhanden ist. Verwenden Sie entsprechend.
quelle
console.log((new Error()).stack.split("\n")[1].trim().split(" ")[1])
Update 2018
caller
ist im strengen Modus verboten . Hier ist eine Alternative mit dem (nicht standardmäßigen)Error
Stapel .Die folgende Funktion scheint die Aufgabe in Firefox 52 und Chrome 61-71 zu erfüllen, obwohl ihre Implementierung viele Annahmen über das Protokollierungsformat der beiden Browser macht und mit Vorsicht verwendet werden sollte, da sie eine Ausnahme auslöst und möglicherweise zwei reguläre Ausdrücke ausführt Matchings bevor es fertig ist.
quelle
Ich wollte hier meine Geige hinzufügen:
http://jsfiddle.net/bladnman/EhUm3/
Ich habe getestet, dass dies Chrom, Safari und IE (10 und 8) ist. Funktioniert gut. Es gibt nur eine Funktion, die wichtig ist. Wenn Sie also Angst vor der großen Geige haben, lesen Sie weiter unten.
Hinweis: In dieser Geige befindet sich eine ganze Menge meiner eigenen "Boilerplate". Sie können all das entfernen und Splits verwenden, wenn Sie möchten. Es ist nur ein ultra-sicherer Satz von Funktionen, auf die ich mich verlassen kann.
Es gibt dort auch eine "JSFiddle" -Vorlage, die ich für viele Geigen verwende, um einfach schnell zu fummeln.
quelle
String.prototype.trim = trim;
Wenn Sie nur den Funktionsnamen und nicht den Code und eine browserunabhängige Lösung wünschen, verwenden Sie Folgendes:
Beachten Sie, dass das oben Gesagte einen Fehler zurückgibt, wenn keine Aufruferfunktion vorhanden ist, da das Array kein [1] -Element enthält. Verwenden Sie zum Umgehen Folgendes:
quelle
Ich möchte Sie nur wissen lassen, dass auf PhoneGap / Android das nicht zu
name
funktionieren scheint. Aberarguments.callee.caller.toString()
wird den Trick machen.quelle
Hier ist alles , aber das
functionname
ist gestrippt auscaller.toString()
, mit RegExp.quelle
Hier ist eine Funktion, um eine vollständige Stapelverfolgung zu erhalten :
quelle
Die Antwort von heystewart und die Antwort von JiarongWu erwähnten beide, dass das
Error
Objekt Zugriff auf die hatstack
.Hier ist ein Beispiel:
Verschiedene Browser zeigen den Stapel in verschiedenen Zeichenfolgenformaten:
Safari : Caller is: main@https://stacksnippets.net/js:14:8 Firefox : Caller is: main@https://stacksnippets.net/js:14:3 Chrome : Caller is: at main (https://stacksnippets.net/js:14:3) IE Edge : Caller is: at main (https://stacksnippets.net/js:14:3) IE : Caller is: at main (https://stacksnippets.net/js:14:3)
Die meisten Browser setzen den Stack mit
var stack = (new Error()).stack
. In Internet Explorer ist der Stapel undefiniert - Sie müssen eine echte Ausnahme auslösen, um den Stapel abzurufen.Fazit: Mit dem
stack
imError
Objekt kann festgestellt werden, dass "main" der Aufrufer von "Hello" ist . Tatsächlich funktioniert es in Fällen, in denen dercallee
/caller
-Ansatz nicht funktioniert. Es zeigt Ihnen auch den Kontext, dh die Quelldatei und die Zeilennummer. Es sind jedoch Anstrengungen erforderlich, um die Lösung plattformübergreifend zu gestalten.quelle
Beachten Sie, dass Sie Function.caller in Node.js nicht verwenden können. Verwenden Sie stattdessen das Anrufer-ID- Paket. Zum Beispiel:
quelle
Versuchen Sie den folgenden Code:
Arbeitete für mich in Firefox-21 und Chrom-25.
quelle
arguments.callee
ist seit vielen Jahren veraltet .Eine andere Möglichkeit, dieses Problem zu umgehen, besteht darin, einfach den Namen der aufrufenden Funktion als Parameter zu übergeben.
Zum Beispiel:
Jetzt können Sie die Funktion folgendermaßen aufrufen:
In meinem Beispiel wird eine fest codierte Überprüfung des Funktionsnamens verwendet, aber Sie können problemlos eine switch-Anweisung oder eine andere Logik verwenden, um dort das zu tun, was Sie möchten.
quelle
Soweit ich weiß, haben wir zwei Möglichkeiten dafür aus bestimmten Quellen wie diesen:
Argumente.Caller
Funktionsanrufer
Denke du hast deine Antwort :).
quelle
Warum alle oben genannten Lösungen wie eine Raketenwissenschaft aussehen. In der Zwischenzeit sollte es nicht komplizierter sein als dieses Snippet. Alle Credits an diesen Kerl
Wie finden Sie die Aufruferfunktion in JavaScript heraus?
quelle
Ich versuche, mit dieser Frage sowohl die Frage als auch das aktuelle Kopfgeld anzusprechen.
Die Prämie erfordert, dass der Anrufer im strengen Modus erhalten wird, und die einzige Möglichkeit, dies zu sehen, besteht darin, auf eine außerhalb deklarierte Funktion zu verweisen des strengen Modus .
Das Folgende ist beispielsweise nicht Standard, wurde jedoch mit früheren (29.03.2016) und aktuellen (1. August 2018) Versionen von Chrome, Edge und Firefox getestet.
quelle
Wenn Sie die Funktionalität aus irgendeinem Grund wirklich benötigen und möchten, dass sie browserübergreifend kompatibel ist und sich nicht um strenge Dinge kümmert und vorwärtskompatibel ist, übergeben Sie diese Referenz:
quelle
Ich denke, das folgende Code-Stück kann hilfreich sein:
Führen Sie den Code aus:
Das Protokoll sieht folgendermaßen aus:
quelle