Ottieni il nome della funzione in JavaScript

Qualcuno sa se c’è un modo per ottenere il nome della funzione JavaScript. Ad esempio ho ottenuto una funzione come

function test1(){ alert(1); } 

Ce l’ho nella mia testa. Quindi creo un object obj1 e metto la mia funzione lì

 obj1.func = test1; 

Quando chiamo un metodo nell’object obj1, ho modo di ottenere il nome della mia funzione (test1) all’interno di questo metodo, eccetto l’analisi dell’origine ( this.func.toString() ) della funzione.

 function test() { alert(arguments.callee.name); } b = test; b(); 

uscite “test” (in Chrome, Firefox e probabilmente Safari). Tuttavia, arguments.callee.name è disponibile solo dall’interno della funzione.

Se vuoi ottenere un nome dall’esterno, puoi analizzarlo da:

 b.toString(); 

ma penso che la proprietà name dell’object function possa essere ciò di cui hai bisogno:

 alert(b.name); 

questo tuttavia non sembra funzionare per IE e Opera, quindi è necessario analizzarlo manualmente in quei browser.

Fino all’ES2015 non esisteva un modo standard per ottenere il nome di una funzione. La maggior parte dei browser correnti supporta una proprietà name su oggetti Function che non era standard fino a ES2015, ma non esiste una versione corrente di IE. L’unica opzione che ti lascia se hai bisogno di supportare IE sta cercando di analizzare il nome dalla rappresentazione della stringa della funzione, che non è una buona idea . C’è una (lunga) discussione qui a riguardo: http://groups.google.com/group/comp.lang.javascript/browse_frm/thread/b85dfb2f2006c9f0

Ecco cosa uso per inserire i nomi delle classi nei messaggi di errore. Include il codice per ottenere il nome delle funzioni, che funziona nella maggior parte dei browser.

Ovviamente, non esiste un modo standard che funzioni sempre, quindi è sempre necessario fornire un nome che possa essere utilizzato se non viene trovato nessun altro nome.

 var nameFromToStringRegex = /^function\s?([^\s(]*)/; /** * Gets the classname of an object or function if it can. Otherwise returns the provided default. * * Getting the name of a function is not a standard feature, so while this will work in many * cases, it should not be relied upon except for informational messages (eg logging and Error * messages). * * @private */ function className(object, defaultName) { var result = ""; if (typeof object === 'function') { result = object.name || object.toString().match(nameFromToStringRegex)[1]; } else if (typeof object.constructor === 'function') { result = className(object.constructor, defaultName); } return result || defaultName; } 

La cosa migliore da fare è:

 function functionName(fun) { var ret = fun.toString(); ret = ret.substr('function '.length); ret = ret.substr(0, ret.indexOf('(')); return ret; } 

Nota: l’utilizzo di Function.caller non è standard e arguments.callee è vietato in modalità rigorosa.

Un modo interessante in cui sto sperimentando è una dichiarazione come la seguente:

 var test1 = function test1(){ alert(1); }; 

È un po ‘hacky, ma quello che succede è che test1 è una variabile locale che contiene un object [Function: test1] .

Ecco cosa succede quando usi il codice basato su di esso:

 test1(); //runs the function as expected console.log(test1.name); //prints 'test1' 

Quindi se fai quanto segue:

 obj1.func = test1; 

Sarai quindi in grado di fare riferimento a obj1.func.name e restituirà 'test1' .

Questo è probabilmente il modo migliore per farlo:

 var myfunc = function () {}; var funcName = myfunc.constructor.name; 

Questo può essere fatto al di fuori dell’esecuzione della funzione e puoi verificarlo nel contesto della console del browser.

Buona programmazione!

È ansible convertire la funzione in una stringa (fn + '') e dividerla in seguito in spazi bianchi e parentesi aperte /\s|\(/ .

 var getFunctionName = function (fn) { return (fn + '').split(/\s|\(/)[1]; };