2016-09-29 7 views
0

Ich versuche eine generische Funktion ('displayFuncName()' zum Beispiel) zu erstellen, die ich in verschiedenen Funktionsdefinitionen aufrufen könnte (zum Beispiel 'foo()'), also wird console.log den Funktionsnamen ('foo' in diesem Beispiel). so etwas wie:Javascript - generische Funktion zum Anzeigen des Anruferfunktionsnamens

var displayFuncName = function(){ 
console.log("caller function name: " + some parameter); 
} 

var foo = function(){ 
displayFuncName(); // should console log "caller function name: foo 
} 

Ich weiß, es wurde auf unterschiedliche Weise in der Vergangenheit gefragt, aber es scheint, wie es einige veraltete Option war, und einige von ihnen zeigt nur den Namen ‚displayFuncName‘ Funktion, die natürlich nicht was ich will.

+1

'console.log (arguments.callee.name)' – Redu

+1

Die fünfte Ausgabe von ECMAScript (ES5) verbietet die Verwendung von arguments.callee() im strikten Modus. –

+0

@Redu - Es wird 'displayFuncName' zurückgegeben – Rayon

Antwort

0
console.log("caller is " + arguments.callee.caller.name); 
0

Wäre es nicht einfacher, die Funktionsnamen (oder die Funktion selbst wenn Sie theCallerFunction.name verwenden)?

Dies wird Ihnen die gleichen Ergebnisse, nur auf eine viel einfachere Weise. Es ist auch viel weniger wahrscheinlich, dass .Name abgeschrieben wird.

var displayFuncName = function(callerFunc){ 
console.log("caller function name: " + callerFunc.name); 
} 

var function = foo(){ 
displayFuncName(foo); 
} 

"arguments.callee.caller.name" wird abgeschrieben, glaube ich.

+0

'var function = foo() {' ist eine ungültige Syntax. – evolutionxbox

+0

Ich wollte vermeiden, jeden Funktionsnamen spezifisch zu senden, so dass es generisch wäre. – user2880391

2

Da arguments.callee einen Fehler im Strict-Modus führt und arguments.caller nicht mehr unterstützt wird, vielleicht so etwas wie das für Sie eine bessere Option sein:

Function.prototype.logName = function() { 
    var fn = this; 
    return function() { 
     console.log(fn.name); 
     return fn.apply(this, arguments); 
    } 
} 

var f = function named() {}.logName(); 
f(); // logs `named` 

Auf diese Weise können Sie die logName rufen für jede Funktion Sie möchten den Namen protokollieren, wenn er angerufen wird.

+0

Das ist nett, aber es ist kompliziert, und wenn ich es richtig mache - muss ich dedizierte Änderungen vornehmen, damit es funktioniert. (wie das Hinzufügen des 'named()', das ist, als würde man den Namen der Funktionen zweimal schreiben und am Ende den 'logName()' hinzufügen). – user2880391

+0

Wie ich es sehe, ist es nicht mehr von dedizierten Änderungen als einen Funktionsaufruf in jede Funktion, für die Sie einen Namen aufzeichnen möchten. _like das 'named()' hinzufügen, das ist wie das Schreiben des Namens der Funktionen double_ - nein, es ist der Name der Funktion. 'var f = function()' - 'f' ist hier kein Name und' callee.name' gibt dir nicht 'f'. 'logName()' funktioniert am Ende ähnlich wie 'bind' und damit können Sie steuern, welche Funktionen protokolliert werden müssen. Was ist der Zweck von allem? –

0

Statt eine generische Funktion aus jeder Methode aufrufen, können Sie so etwas wie

arguments.callee.caller.name 

verwenden Dies gibt Ihnen den Namen der Funktion, die Ihre Funktion aufgerufen. Wenn Sie dies in Ihrer generischen Methode verwenden, erhalten Sie den Namen der Funktion, in der Sie den Aufrufer kennen möchten. Aber, wenn Sie eine allgemeine Annahme haben, dass Sie den Anrufer Ihres Anrufers wissen möchten, können Sie etwas wie dieses verwenden.

firstFunction(); 
 

 
function firstFunction(){ 
 
secondFunction(); 
 
} 
 

 
function secondFunction(){ 
 
whoCalled(); 
 
} 
 

 
function whoCalled(){ 
 
alert("caller is " + arguments.callee.caller.arguments.callee.caller.name); 
 
}

0

Eine Lösung wäre dies:

var displayFuncName = function(o) { 
 
    console.log(o.name); 
 
} 
 

 
var foo = function(){ 
 
    displayFuncName(foo); 
 
    console.log(foo.name); // also possible 
 
} 
 

 
foo();

Aber man kann viel mehr Lösungen finden.

See here.

0
var displayFuncName = function(){ 
console.log("caller function name: " + arguments.callee.caller.name); 
} 

function foo(){ 
displayFuncName(); // should console log "caller function name: foo 
} 
foo(); 

oder auch wenn Sie die ganze Funktion wollen, dann können Sie

var displayFuncName = function(){ 
console.log("caller function name: " + arguments.callee.caller.toString()); 
} 

var foo = function(){ 
displayFuncName(); // should console log "caller function name: foo 
} 
foo(); 

verwenden Je nachdem, was Ihre Anforderung entspricht.

+0

funktioniert nicht für mich - ich bekomme leere Zeichenfolge – user2880391

Verwandte Themen