¿Cómo puedo acceder al nombre de una función desde dentro de esa función?
// parasitic inheritance
var ns.parent.child = function() {
var parent = new ns.parent();
parent.newFunc = function() {
}
return parent;
}
var ns.parent = function() {
// at this point, i want to know who the child is that called the parent
// ie
}
var obj = new ns.parent.child();
javascript
function
Scott Klarenbach
fuente
fuente
Respuestas:
En ES5, lo mejor que puede hacer es:
El uso
Function.caller
no es estándar.Function.caller
yarguments.callee
ambos están prohibidos en modo estricto.Editar: la respuesta basada en expresiones regulares de nus a continuación logra lo mismo, ¡pero tiene un mejor rendimiento!
En ES6, solo puede usar
myFunction.name
.Nota: Tenga en cuenta que algunos minificadores JS pueden descartar nombres de funciones, para comprimir mejor; Es posible que deba modificar su configuración para evitar eso.
fuente
fun.toString().substr(0, 100)
que para mis necesidades será suficiente para ubicar la función en cuestión. Entonces, gracias por la inspiración!myFunction.name
es lo mejor que se puede hacer en ES6.myFunction.name
si escribe el nombre de la función? derrota el propósito de las variables mágicas.arr[index].name
luego también funcionará :)myFunction.name
también se actualizará. Claro, intelliJ admite cambiar el nombre de los identificadores dentro de las cadenas, pero eso funciona de manera mucho menos consistente y se quedará desactualizado en silencio si alguien olvida marcar la opción "buscar en cadenas".myFunction.name
es una opción un poco mejor que codificar la cadena.ES6 (inspirado por la respuesta de sendy halim a continuación):
Explicación sobre MDN . A partir de 2015 funciona en nodejs y en todos los principales navegadores, excepto IE.
Nota: En las funciones enlazadas, esto dará "
bound <originalName>
". Tendrá que quitar el "límite" si desea obtener el nombre original.ES5 (inspirado por la respuesta de Vlad):
Si tiene una referencia a la función, puede hacer:
caller
ycallee
se consideran obsoletos.[1] Lo incluyo aquí porque es legal y, a menudo, suficientes herramientas de resaltado de sintaxis no tienen en cuenta el espacio en blanco entre el nombre de la función y el paréntesis. Por otro lado, no conozco ninguna implementación de .toString () que incluya espacios en blanco aquí, por lo que puede omitirlo.
Como respuesta a la pregunta original, dejaría la herencia parasitaria y elegiría algunos patrones de diseño OOP más tradicionales. Escribí un TidBits.OoJs para escribir cómodamente el código OOP en JavaScript con un conjunto de características que imita C ++ (aún no está completo, pero en su mayoría).
Veo por los comentarios que le gustaría evitar pasar las
parent
necesidades de información a su constructor. Sin embargo, debo admitir que los patrones de diseño tradicionales no lo salvarán de ese, ya que generalmente se considera bueno hacer que sus dependencias sean obvias y forzadas.También sugeriría alejarse de las funciones anónimas. Solo realizan depuración y creación de perfiles de un PITA porque todo aparece como "función anónima", y no hay ningún beneficio para ellos que yo sepa.
fuente
.name
propiedad de un método componente se mostraba como el "valor" de la cadena, sin importar cómo se llamara. Por extraño que parezca, mientras estaba probando en la aplicación de la exposición, estuvo bien, sin embargo, una vez compilada en una aplicación real, se bloqueaba en silencio.lo que estás haciendo es asignar una función sin nombre a una variable. probablemente necesite una expresión de función con nombre en su lugar ( http://kangax.github.com/nfe/ ).
sin embargo, no estoy seguro de cuánto es el navegador cruzado; Hay un problema con IE6 que hace que el nombre de su función se filtre al ámbito externo. Además, argumentos.callee está en desuso y resultará en un error si lo está utilizando
strict mode
.fuente
Cualquiera
constructor
expone una propiedadname
, que es el nombre de la función. Accede aconstructor
través de una instancia (usandonew
) o unprototype
:fuente
console.log
registros de la primera llamadawindow
oObject
para mí dependiendo de dónde lo ejecute, noPerson
.Parece lo más estúpido que escribí en mi vida, pero es divertido: D
d
- profundidad de la pila.0
- devolver el nombre de esta función,1
- padre, etc .;[0 + d]
- solo para entender - lo que sucede;firefoxMatch
- funciona para un safari, pero realmente tuve un poco de tiempo para las pruebas, porque el dueño de Mac había regresado después de fumar y me llevó lejos: '(Pruebas:
Resultado:
Chrome:
Fitefox:
¡Esta solución fue creada solo por diversión ! No lo use para proyectos reales. No depende de la especificación ES, solo depende de la realización del navegador. Después de la próxima actualización de Chrome / Firefox / Safari, puede estar roto.
Más que eso, no hay procesamiento de error (ha) - si
d
será mayor que la longitud de la pila - obtendrá un error;Para el patrón de mensaje de error de otros wrowsers, obtendrá un error;
Debe funcionar para las clases ES6 (
.split('.').pop()
), pero aún puede obtener un error;fuente
Esto podría funcionar para usted:
ejecutar foo () generará "foo" o indefinido si llama desde una función anónima.
También funciona con constructores, en cuyo caso generaría el nombre del constructor que realiza la llamada (por ejemplo, "Foo").
Más información aquí: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Caller
Afirman que no es estándar, pero también que es compatible con todos los principales navegadores: Firefox, Safari, Chrome, Opera e IE.
fuente
No puedes Las funciones no tienen nombres según el estándar (aunque mozilla tiene dicho atributo), solo pueden asignarse a variables con nombres.
También tu comentario:
está dentro de la función my.namespace.myFunc.getFn
Lo que puede hacer es devolver el constructor de un objeto creado por new
Entonces podrías decir
fuente
Podría usar esto, para navegadores que admitan Error.stack (probablemente no todos)
Por supuesto, esto es para la función actual, pero se entiende la idea.
feliz babeando mientras codificas
fuente
Puede usar la
name
propiedad para obtener el nombre de la función, a menos que esté usando una función anónimaPor ejemplo:
ahora intentemos con una función con nombre
ahora puedes usar
fuente
Puede usar el nombre del constructor como:
este código simplemente devuelve el nombre de un método.
fuente
como parte ya
ECMAScript 6
que puedes usar el método Function.namefuente
Podrías usar
Function.name
:En la mayoría de las implementaciones de JavaScript, una vez que tiene el alcance de la referencia de su constructor, puede obtener su nombre de cadena a partir de su propiedad de nombre (por ejemplo, Function.name u Object.constructor.name
Podrías usar
Function.callee
:El
arguments.caller
método nativo ha quedado en desuso, pero la mayoría de los navegadores son compatiblesFunction.caller
, lo que devolverá el objeto de invocación real (su cuerpo de código): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ Función / llamador? Redirectlocale = es-ES & redirectslug = JavaScript% 2FReference% 2FGlobal_Objects% 2FFunction% 2FcallerPodrías crear un mapa fuente :
Si lo que necesita es la firma de la función literal (el "nombre" del mismo) y no el objeto en sí, es posible que deba recurrir a algo un poco más personalizado, como crear una referencia de matriz de los valores de cadena API que necesitará. acceder con frecuencia. Puede mapearlos juntos
Object.keys()
y su conjunto de cadenas, o buscar en la biblioteca de mapas fuente de Mozilla en GitHub, para proyectos más grandes: https://github.com/mozilla/source-mapfuente
Sé que esta es una vieja pregunta, pero últimamente me he enfrentado a un problema similar al tratar de decorar algunos métodos de React Component, con fines de depuración. Como la gente ya dijo,
arguments.caller
yarguments.callee
están prohibidos en modo estricto, que probablemente esté habilitado de forma predeterminada en su Transpilación de React. Puede deshabilitarlo, o he podido encontrar otro truco, porque en React se nombran todas las funciones de clase, en realidad puede hacer esto:fuente
Esto funcionó para mí.
Código de prueba:
fuente
Tuve un problema similar y lo resolví de la siguiente manera:
Este código implementa, de una manera más cómoda, una respuesta que ya leí aquí en la parte superior de esta discusión. Ahora tengo una función miembro que recupera el nombre de cualquier objeto de función. Aquí está el guión completo ...
fuente
Si entendí lo que querías hacer, esto es lo que hago dentro de un constructor de funciones.
fuente
Esto funcionará en ES5, ES6, todos los navegadores y funciones de modo estricto.
Así es como se ve con una función con nombre.
Así es como se ve con una función anónima.
fuente
at myName (<anonymous>:2:15)
Firefox:@debugger eval code:3:3
mira aquí: http://www.tek-tips.com/viewthread.cfm?qid=1209619
Parece ser adecuado para sus necesidades.
fuente
puede usar Error.stack para rastrear el nombre de la función y la posición exacta de dónde se encuentra.
Ver stacktrace.js
fuente
Manera fácil de obtener el nombre de la función desde la función que está ejecutando.
fuente
this
básicamente puede ser cualquier cosa. probar(function(){console.log(this.name);}).bind({name: "put basically anything here even an object maybe a 1TB string maybe a class definition"})()