2009-03-29 9 views

Respuesta

3

Si usted está tratando de llamar MyFunc desde dentro doSomething, que sólo puede pasar la función real:

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

No hay una muy buena manera de obtener el nombre de la función. En JavaScript, puede tener funciones anónimas y, por lo tanto, no tiene una forma decente de nombrarlas.

En cualquier caso, puede tener algo de suerte usando arguments.callee.toSring(). Por ejemplo:

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

Pero, esto es pobre porque no todas las funciones tienen nombres y algunos navegadores pueden añadir detalles específicos de la implementación de esta cadena.

Pero, ¿quizás estás tratando de hacer otra cosa además de obtener el nombre? Si desea llamar finalmente a la función, puede pasar la función en sí. Esto se llama una función lambda. Por ejemplo:

function foo(inFunc) { 
    inFunc(); 
} 

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

El código anterior crea una función anónima que muestra una alerta. Luego pasa a la función foo que simplemente llama a cualquier función que se le pase.

-1

Si usted tiene esta función:

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

se le puede llamar de esta manera:

function testTest(func) 
{ 
    func(); 
} 

testTest(test); 
1

Como otros han señalado, lo más probable es que todo lo que estamos tratando de hacer se puede hacer mejor de una manera diferente. Sin embargo, si realmente necesita encontrar el nombre de una función, hay una forma bastante sencilla de hacerlo, pero no funcionará en todos los casos.

//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 limitación aquí, es que se necesitará tanto el objeto y la función, y la función tendrá que ser iterable - lo que significa que no puede ser una función integrada.

1

Quizás quiera decir algo como esto?

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

las iteraciones de bucle a través del objeto y proporciona una matriz que contiene el nombre del método y un puntero con el método (o un mensaje de error).

2

Esta es una vieja pregunta, pero en ES6 esta capacidad se proporciona a través de la propiedad Function.name. El ECMAScript 2015 Language Specification define how this property is added to a Function instance:

9.2.11 SetFunctionName (F, nombre, prefijo)

La operación abstracta SetFunctionName requiere un argumento FunctionF, un argumento nameString o Symbol y opcionalmente un prefijo String argumento. Esta operación se suma una propiedad name-F realizando los siguientes pasos: ...

Desafortunadamente, esto aún no se ha implementado en todos los principales navegadores: Es que aparece here como no compatibles en todas las versiones de IE, y sólo parcialmente compatible en todos los otros navegadores principales (con Edge 13 teniendo el mejor soporte, aunque todavía parcial, actualmente).

Cuestiones relacionadas