2016-07-18 98 views
13

Ho bisogno del nome della funzione corrente come stringa per accedere alla nostra funzione di registro. Ma arguments.callee.name funziona solo in modalità libera. Come ottenere il nome della funzione sotto "use strict"?Ottieni il nome della funzione corrente in modalità rigorosa

+2

Se si è in grado di modificare il corpo della funzione per aggiungere codice di registrazione, non puoi semplicemente codificare il nome della funzione? Che vantaggio avresti se potessi leggerlo da una proprietà? – nnnnnn

+4

@nnnnnn qualcuno continua a rinominare le funzioni ma si dimentica di aggiornare la linea di registro. – exebook

risposta

18

Ai fini della registrazione/debug, è possibile creare un nuovo Error oggetto nel registratore e controllare la sua proprietà .stack, per esempio

function logIt(message) { 
 
    var stack = new Error().stack, 
 
     caller = stack.split('\n')[2].trim(); 
 
    console.log(caller + ":" + message); 
 
} 
 

 
function a(b) { 
 
    b() 
 
} 
 

 
a(function xyz() { 
 
    logIt('hello'); 
 
});

+0

La tua risposta è un po 'complicata, ma mostra l'idea. – exebook

+0

Una grande risposta @georg. Nota che '' [2] '' è relativo solo a questo esempio, se hai per esempio uno stack contenente tre funzioni genitore in questo caso dobbiamo cambiare ** 2 ** a ** 3 ** – Ismail

+3

@hamism: 'stack [2] 'è sempre la funzione che ha chiamato il logger, indipendentemente dalla profondità dello stack. – georg

0

Dopo po 'di ricerca qui è una buona soluzione:

function getFnName(fn) { 
    var f = typeof fn == 'function'; 
    var s = f && ((fn.name && ['', fn.name]) || fn.toString().match(/function ([^\(]+)/)); 
    return (!f && 'not a function') || (s && s[1] || 'anonymous'); 
} 



function test(){ 
    console.log(getFnName(this)); 
} 

test = test.bind(test); 

test(); // 'test' 

Fonte: https://gist.github.com/dfkaye/6384439

+2

Ma ciò non funziona all'interno della funzione a meno che non si abbia già un riferimento alla funzione. OP ha chiesto un sostituto per 'arguments.callee.name' ... – nnnnnn

1

È possibile associare la funzione come il suo contesto, allora è possibile accedere a suo nome tramite this.name proprietà:

function x(){ 
    console.log(this.name); 
} 
x.bind(x)();