2009-03-29 20 views

risposta

3

Se si sta tentando di chiamare MyFunc dall'interno doSomething, si può semplicemente passare la funzione reale:

var someObject = new Object(); 
someObject.MyFunc = function() { alert('test'); } 
function doSomething(func) { 
    func(); 
} 
doSomething(someObject.MyFunc); 
4

Non c'è davvero un buon modo per ottenere il nome della funzione. In JavaScript, puoi avere funzioni anonime e quindi non hai un modo decente per nominarle.

In ogni caso, si potrebbe avere un po 'di fortuna usando arguments.callee.toSring(). Per esempio:

function foo() { 
    alert("I am " + arguments.callee.toString()); 
} 

Ma, questo è povero, perché non tutte le funzioni hanno nomi e alcuni browser possono aggiungere dettagli specifici di implementazione per questa stringa.

Ma, forse stai cercando di fare qualcos'altro oltre a ottenere il nome? Se si desidera infine chiamare la funzione, è possibile effettivamente passare la funzione stessa. Questa è chiamata funzione lambda. Ad esempio:

function foo(inFunc) { 
    inFunc(); 
} 

foo(function() { alert("foo"); }); 

Il codice precedente crea una funzione anonima che fa apparire un avviso. Viene quindi passato alla funzione foo che chiama solo qualsiasi funzione viene passata in esso.

-1

Se si dispone di questa funzione:

function test() 
{ 
    alert('here'); 
} 

si può chiamare in questo modo:

function testTest(func) 
{ 
    func(); 
} 

testTest(test); 
1

Come altri hanno fatto notare, è più probabile che tutto ciò che si sta cercando di fare può essere fatto meglio in un modo diverso. Tuttavia, se hai davvero bisogno di trovare il nome di una funzione, c'è un modo abbastanza semplice per farlo, ma non funzionerà in tutti i casi.

//returns the name of the function func on the object obj 
function getFuncName(obj, func){ 
    for(var funcName in obj){ 
    if(obj[funcName] === func){ 
     return funcName; 
    } 
    } 
} 

alert(getFuncName(Object, Object.MyFunc)); //alerts "MyFunc" 

La limitazione qui, è che avrete bisogno sia l'oggetto e la funzione, e la funzione dovrà essere iterabile - il che significa che non può essere un costruito in funzione.

1

Forse vuoi dire qualcosa del genere?

function getFn(fnName){ 
    for (var l in yourObj){ 
     if (l === fnName && yourObj[l] instanceof Function){ 
     return [ l, yourObj[l] ]; 
     } 
    } 
    return [fnName ,'not found']; 
} 

le un'iterazione attraverso l'oggetto e fornisce un vettore contenente il nome del metodo e un puntatore al metodo (o un messaggio di errore).

2

Questa è una vecchia domanda, ma in ES6 questa capacità viene fornita tramite la proprietà Function.name. Il ECMAScript 2015 Language Specification definisce how this property is added to a Function instance:

9.2.11 SetFunctionName (F, nome, prefisso)

L'operazione astratta SetFunctionName richiede un argomento FunctionF, un String o Symbol argomento name e opzionalmente un prefisso String argomento. Questa operazione aggiunge una proprietà name-F eseguendo le seguenti operazioni: ...

Purtroppo, questo non è ancora stato implementato in tutti i principali browser: E 'classificato come here non supportata in tutte le versioni di IE, e solo parzialmente supportato in tutti gli altri browser principali (con Edge 13 che offre il supporto migliore, anche se ancora parziale, attualmente).

Problemi correlati