2011-07-05 14 views
16

tengo este pedazo de código:obtener el nombre de la función actual en javascript

function MyFunction() 
{ 
    $.ajax({ 
     type: "POST", 
     url: "ajax.php", 
     dataType: "json", 
     data: "foo=bar", 
     error:function(XMLHttpRequest, textStatus, errorThrown) 
     { 
      alert(arguments.callee); 
     }, 
     success: function(jsonObject) 
     { 
      //do something 
     } 
    }); 
} 

lo que quiero es que la alerta en el interior Scoope de error muestra el nombre de la función, en este caso "MyFunction", sino que lo que obtener es el error: función.

¿Cómo puedo lograrlo?

+1

Debo estar perdiendo algo. ¿Por qué no simplemente escribir 'alert ('MyFunction');'? –

+0

¿Por qué necesita obtener el nombre de la función? Es posible que estés abordando el problema incorrectamente. – Amrit

+2

Quiero un fragmento que pueda usar en varias funciones. De esta forma puedo mostrar un error y saber en qué función ocurrió el error sin codificar el nombre de la función –

Respuesta

18

Este -

var my_arguments; 

function MyFunction() { 
    my_arguments = arguments; 

    $.ajax({ 
     type: "POST", 
     url: "http://www.google.com", 
     dataType: "json", 
     data: "foo=bar", 
     error:function(XMLHttpRequest, textStatus, errorThrown) { 
      alert(my_arguments.callee.name); 
     }, 
     success: function(jsonObject) { 
      //do something 
     } 
    }); 
} 

es lo que necesita.

El arguments dentro de la función error se refiere al objeto propio arguments de este método. No se refiere al objeto arguments de MyFunction. Es por eso que obtiene error:MyFunction. El uso de una variable global en este caso le proporciona una solución alternativa a este problema.

Además, para obtener solo el nombre de la función, debe usar arguments.callee.name. arguments.callee le dará una referencia a la función de llamada, no un nombre de función en cadena.

1

Está utilizando arguments dentro del alcance de la función de error. Es necesario algo como esto si desea que el arguments de MyFunction():

function MyFunction() 
{ 
    var myfunction_arguments = arguments; 

    $.ajax({ 
     type: "POST", 
     url: "ajax.php", 
     dataType: "json", 
     data: "foo=bar", 
     error:function(XMLHttpRequest, textStatus, errorThrown) 
     { 
      alert(myfunction_arguments.callee); 
     }, 
     success: function(jsonObject) 
     { 
      //do something 
     } 
    }); 
} 

es eso lo que quiere decir?


+0

¡gracias! usted y Sayem Ahmed realmente me ayudan –

6

Lo que queremos es arguments.callee.name sin embargo, en su caso, la función de contexto en el Ya no MyFunction pero el método anónimo declarado como el gestor de errores ...

-2

Trate

  error:function(xhr){ 
       alert('Error: '+xhr.status+' '+xhr.statusText); 
      } 
-1
alert('MyFunction'); 

No se puede hacer nada mejor que de forma fiable, ya que la función no tiene casi nada que ver con el gestor de errores: El gestor de errores puede muy posiblemente se han creado en otro contexto totalmente, uno que encierra MyFunction, o pasado a etc.

MyFunction no llama al controlador por lo que consultar arguments.* no va a ayudar.

Se puede inyectar un valor en el alcance:

function MyFunction(){ 
    var _injectedFunctionName = arguments.callee.name; 

    ... 
    // inside the error handler 
    alert(_injectedFunctionName); 
    ... 
} 

A pesar de que se supone que ningún valor con el mismo nombre chocará (una suposición razonable en muchos casos, y no tan razonable en otros).

El hecho de que desee el nombre de la función es probablemente una buena indicación de que está pensando incorrectamente en el problema. Quizás si explicas lo que intentas hacer de manera más amplia, la comunidad puede proponer alternativas.

4

En el modo estricto ya no se puede hacer referencia a callee (consulte el debate relacionado en Javascript: is the arguments array deprecated?), por lo que la respuesta de @Sayem solo es válida si no está utilizando el modo estricto. En general, desea invocar el modo estricto debido a sus beneficios para la confiabilidad de su código (consulte @JohnResig article).

Todavía me gustaría tener una forma de referenciar el nombre de la función actual solo para arrojar mensajes de error con un contexto. P.ej.

throw myFunctionName() + ': número inválido de argumentos';

Por ahora tengo que codificar el nombre de la función dentro de los throws. Moví el código y olvidé actualizar los nombres de las funciones codificadas.

He pensado en una convención de codificación de tener un THIS_FUNCTION_NAME = 'foobar' como un const definido al principio de la función, pero por supuesto que puede moverse y no actualizarse también.

Supongo que siempre que tengas un rastro de pila disponible desde el lanzamiento, el punto es discutible.

3

tiempo para actualizar este hilo por una respuesta fresca :)

Uso console.trace();

Just call console.trace() and Firebug will write a very informative stack trace to the console. Not only will it tell you which functions are on the stack, but it will include the value of each argument that was passed to each function. You can click the functions or objects to inspect them further.

JavaScript Ejemplo:

function fn1(arg1, arg2) { 
    var arg3 = 'myArg3'; 
    fn2(arg1, arg2, arg3); 
} 
function fn2(arg1, arg2, arg3) { 
    var obj = { 
     attr1 : 'val1', 
     attr2 : 'val2' 
    }; 
    console.trace(obj); 
} 
fn1('myArg1', 'myArg2', 'myArg3'); 


Firefox consola (versión: 43.0.1):

Firefox console (version: 43.0.1)


Google Chrome consola (versión: 47.0.2526.106 m):

Google Chrome console (version: 47.0.2526.106 m)

puede encontrar here todas las funciones de registro que usted necesita

HTH

Cuestiones relacionadas