2016-03-08 20 views
7

È possibile ottenere il nome di una funzione anonima dichiarata come segue?È possibile ottenere il nome di una funzione JavaScript anonima?

var F = function(){}; 

A prima vista, la risposta è no, ma a quanto pare i browser sanno e tenere premuto il nome della funzione:

var F = function(){}; 
var x = new F(); 
console.log(x.constructor); // function F() 

(Firefox)

var F = function(){}; 
var x = new F(); 
console.log(x); // F {} 

(Chrome)

Questo nome è in qualche modo accessibile? Ne ho bisogno principalmente per la registrazione degli errori, quindi la soluzione non deve essere cross-browser.

Modifica di chiarimenti:

Ricevo un oggetti di codice esterno che ho bisogno di conoscere i loro tipi, di conseguenza risposte ovvie come l'utilizzo di un altro modo di dichiarazione non sono quello che sto cercando.

+0

Mi sono imbattuto in un problema simile con la registrazione degli errori. Nei browser di "Error.stack" verrà incluso il nome del token, è possibile utilizzarlo. – Halcyon

+1

Dai un'occhiata qui http://stackoverflow.com/ questions/332422/how-do-i-get-the-name-of-an-objects-type-in-javascript – Ronnie

+2

Possibile duplicato di [Ottieni nome funzione anonimo] (http://stackoverflow.com/questions/14178305/ get-anonimo-nome-funzione) – whd

risposta

2

Nel caso di utilizzo che si sta tentando, è possibile che ci possa essere più di una variabile che contiene la stessa funzione anonima.

cioè, si può andare avanti così:

var F = function(){}; 
var x = new F(); 
var x2 = x; 
var x3 = x; 
var blah = x3; 

Così, ora abbiamo più di un nome da cercare. E la prima cosa che ho pensato è di scorrere tutti gli oggetti sotto la finestra e stampare il loro nome che ha lo stesso metodo del valore.

Quindi, si potrebbe pensare a qualcosa di simile:

for each (item in window){ 
    if (myfunc == item){ 
     console.log(/*Somehow print the actual name of the item */) 
    } 
} 

Ma, non funziona in questo modo in quanto, ora item è un'altra variabile, e guardare come non c'è built-in proprietà che dà il nome della variabile. , date un'occhiata a Variable name as a string in Javascript, non che questo aiuti qui, però ...

Quindi, infine, da quando hai menzionato che stai cercando di fare la registrazione degli errori, ho pensato di usare le tracce dello stack. Non so se sarà applicabile nella vostra situazione, può essere ancora un po 'illuminante :)

E questo è come va: (Per essere avvertito, questo è un hack)

var myFunction = function(){ 
    var err = new Error(); 
    console.log(err.stack) 
} 
myFunction(); 

volontà uscita qualcosa come:

[email protected] eval code:3:17 
@debugger eval code:6:5 
@debugger eval code:1:15 

E, prendendo che al livello successivo:

var myFunction = function(){ 
    var err = new Error(); 
    console.log(err.stack.split("@")[0]) 
/* split the stack-trace string and get the first word before @ */ 
} 
myFunction(); 

Ora, l'output per tale sarà:

myFunction 

Quale, infatti è il nome della variabile che detiene la funzione anonima.

Nota: Questa risposta è ispirato alla domanda How can I get a Javascript stack trace when I throw an exception?

hanno provato questo solo in Firefox, c'è una possibilità lo stack-trace potrebbe essere diversa altrove.

Edit: mancato di notare la modifica, questa potrebbe essere necessario la modifica delle dichiarazioni, che spezza il caso d'uso. :(