2009-03-29 4 views

Répondre

3

Si vous essayez d'appeler MyFunc à partir de doSomething, vous pouvez juste passer la fonction réelle:

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

Il n'y a pas une très bonne façon d'obtenir le nom de la fonction. En JavaScript, vous pouvez avoir des fonctions anonymes et donc ne pas avoir un moyen décent de les nommer.

Dans tous les cas, vous pourriez avoir de la chance en utilisant arguments.callee.toSring(). Par exemple:

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

Mais, c'est pauvre parce que toutes les fonctions ont des noms et certains navigateurs peuvent ajouter des détails spécifiques à la mise en œuvre de cette chaîne. Mais, peut-être que vous essayez de faire autre chose que d'obtenir le nom? Si vous voulez finalement appeler la fonction, vous pouvez réellement passer la fonction elle-même. C'est ce qu'on appelle une fonction lambda. Par exemple:

function foo(inFunc) { 
    inFunc(); 
} 

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

Le code ci-dessus crée une fonction anonyme qui affiche une alerte. Il est ensuite passé à la fonction foo qui appelle simplement la fonction qui lui est transmise.

-1

Si vous avez cette fonction:

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

Vous pouvez l'appeler ainsi:

function testTest(func) 
{ 
    func(); 
} 

testTest(test); 
1

Comme d'autres l'ont souligné, il est fort probable que tout ce que vous essayez de faire peut être fait mieux d'une manière différente. Cependant, si vous avez vraiment besoin de trouver le nom d'une fonction, il existe une façon assez simple de le faire, mais cela ne fonctionnera pas dans tous les cas.

//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 limitation ici, est que vous aurez besoin à la fois l'objet et la fonction, et la fonction devra être itérable - ce qui signifie qu'il ne peut pas être construit en fonction.

1

Peut-être que vous voulez dire quelque chose comme ça?

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

itération de la boucle à travers l'objet et délivre un tableau contenant le nom de procédé et un pointeur vers la méthode (ou un message d'erreur).

2

Il s'agit d'une vieille question, mais dans ES6 cette capacité est fournie via la propriété . Le ECMAScript 2015 Language Specification définit how this property is added to a Function instance:

9.2.11 SetFunctionName (F, nom, préfixe)

L'opération abstraite SetFunctionName nécessite un argument FunctionF, un argument String ou Symbolname et éventuellement un préfixe d'argument String. Cette opération ajoute une propriété name-F en procédant comme suit: ...

Malheureusement, cela n'a pas encore été mis en œuvre dans tous les principaux navigateurs: Il est répertorié comme here pas pris en charge dans toutes les versions d'IE, et seulement partiellement pris en charge dans tous les autres principaux navigateurs (Edge 13 ayant le meilleur support, quoique encore partiel, actuellement).

Questions connexes