Como posso acessar um nome de função de dentro dessa função?
// 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
fonte
fonte
Respostas:
No ES5, a melhor coisa a fazer é:
O uso
Function.caller
não é padrão.Function.caller
earguments.callee
ambos são proibidos no modo estrito.Edit: a resposta baseada em regex da nus abaixo consegue a mesma coisa, mas tem melhor desempenho!
No ES6, você pode apenas usar
myFunction.name
.Nota: Lembre-se de que alguns minificadores JS podem jogar fora os nomes das funções, para compactar melhor; pode ser necessário ajustar as configurações para evitar isso.
fonte
fun.toString().substr(0, 100)
que, para minhas necessidades, será suficiente para localizar a função em questão. Então, obrigado pela inspiração!myFunction.name
é a melhor coisa a fazer no ES6.myFunction.name
se você digitar o nome da função? derrota o propósito de variáveis mágicas.arr[index].name
também funcionará :)myFunction.name
também será atualizado. Certamente, o intelliJ suporta renomear identificadores dentro de strings, mas isso funciona muito menos consistentemente e fica silenciosamente desatualizado se alguém esquecer de marcar a opção "search in strings".myFunction.name
é uma escolha um pouco melhor do que codificar a string.ES6 (inspirado na resposta de sendy halim abaixo):
Explanação no MDN . A partir de 2015, trabalha no nodejs e nos principais navegadores, exceto no IE.
Nota: Nas funções ligadas, isso dará "
bound <originalName>
". Você precisará remover o "limite" se desejar obter o nome original.ES5 (inspirado na resposta de Vlad):
Se você tiver uma referência à função, poderá:
caller
ecallee
é considerado obsoleto.[1] Eu o incluo aqui porque é legal e muitas vezes as ferramentas de destaque de sintaxe falham em levar em consideração o espaço em branco entre o nome da função e os parênteses. Por outro lado, não conheço nenhuma implementação de .toString () que inclua espaço em branco aqui; é por isso que você pode omiti-lo.
Como resposta à pergunta original, eu descartaria a herança parasitária e buscaria alguns padrões de design de POO mais tradicionais. Eu escrevi um TidBits.OoJs para escrever confortavelmente código OOP em JavaScript com um conjunto de recursos que imitava C ++ (ainda não completo, mas principalmente).
Vejo pelos comentários que você gostaria de evitar a transmissão de informações
parent
necessárias para seu construtor. Devo admitir que os padrões tradicionais de design não o salvam, pois geralmente é uma coisa boa tornar suas dependências óbvias e impostas.Eu também sugeriria me afastar de funções anônimas. Eles apenas fazem da depuração e criação de perfil uma PITA porque tudo aparece como "função anônima", e não há nenhum benefício para eles que eu saiba.
fonte
.name
propriedade de um método do componente estava aparecendo como a string "value", independentemente do nome. Por incrível que pareça, durante os testes no aplicativo expo, tudo estava bem, mas uma vez compilado em um aplicativo real, ele travava silenciosamente.o que você está fazendo é atribuir uma função sem nome a uma variável. você provavelmente precisará da expressão da função nomeada ( http://kangax.github.com/nfe/ ).
no entanto, não tenho certeza de quanto é o navegador; há um problema no IE6 que faz com que você vaze o nome da função para o escopo externo. Além disso, o argumentos.callee é obsoleto e resultará em erro se você estiver usando
strict mode
.fonte
Qualquer
constructor
um expõe uma propriedadename
, que é o nome da função. Você acessa oconstructor
via uma instância (usandonew
) ou umprototype
:fonte
console.log
chamada registrawindow
ouObject
para mim, dependendo de onde eu a corro, nãoPerson
.Parece a coisa mais estúpida que escrevi na minha vida, mas é engraçado: D
d
- profundidade da pilha.0
- retorna este nome de função,1
- pai, etc .;[0 + d]
- apenas para entender - o que acontece;firefoxMatch
- trabalha para o safari, mas eu realmente tive um pouco de tempo para testar, porque o dono do mac voltou depois de fumar e me afastou: '(Teste:
Resultado:
Chrome:
Fitefox:
Esta solução foi criada apenas por diversão ! Não o use para projetos reais. Não depende da especificação do ES, depende apenas da realização do navegador. Após a próxima atualização do chrome / firefox / safari, ele pode estar quebrado.
Mais do que isso, não há erro (ha) no processamento - se
d
for maior que o comprimento da pilha - você receberá um erro;Para o padrão de mensagem de erro de outros wrowsers - você receberá um erro;
Ele deve funcionar para as classes ES6 (
.split('.').pop()
), mas você pode obter um erro;fonte
Isso pode funcionar para você:
executar foo () produzirá "foo" ou indefinido se você chamar de uma função anônima.
Também funciona com construtores; nesse caso, seria exibido o nome do construtor que chamava (por exemplo, "Foo").
Mais informações aqui: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Caller
Eles alegam que não é padrão, mas também é suportado por todos os principais navegadores: Firefox, Safari, Chrome, Opera e IE.
fonte
Você não pode. As funções não têm nomes de acordo com o padrão (embora o mozilla possua esse atributo) - elas podem ser atribuídas apenas a variáveis com nomes.
Também o seu comentário:
está dentro da função my.namespace.myFunc.getFn
O que você pode fazer é retornar o construtor de um objeto criado por novos
Então você poderia dizer
fonte
Você pode usar isso para navegadores que suportam Error.stack (não quase todos, provavelmente)
é claro que isso é para a função atual, mas você entendeu.
babando feliz enquanto você codifica
fonte
Você pode usar a
name
propriedade para obter o nome da função, a menos que esteja usando uma função anônimaPor exemplo:
agora vamos tentar com a função nomeada
agora você pode usar
fonte
Você pode usar o nome do construtor como:
esse código simplesmente retorna o nome de um método.
fonte
como parte como
ECMAScript 6
você pode usar o método Function.namefonte
Você poderia usar
Function.name
:Na maioria das implementações de JavaScript, depois de ter a referência do construtor no escopo, você pode obter o nome da string a partir da propriedade name (por exemplo, Function.name ou Object.constructor.name
Você poderia usar
Function.callee
:O
arguments.caller
método nativo foi descontinuado, mas a maioria dos navegadores suportaFunction.caller
, que retornará o objeto de chamada real (seu corpo de código): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ Função / chamador? Redirectlocale = pt-BR & redirectslug = JavaScript% 2FReference% 2FGlobal_Objects% 2FFunction% 2FcallerVocê pode criar um mapa de origem :
Se o que você precisa é a assinatura da função literal (o "nome" dela) e não o objeto em si, talvez seja necessário recorrer a algo um pouco mais personalizado, como criar uma referência de matriz dos valores de string da API que você precisará acesse com freqüência. Você pode mapeá-los juntos usando
Object.keys()
sua matriz de strings, ou procurar na biblioteca de mapas de fontes do Mozilla no GitHub, para projetos maiores: https://github.com/mozilla/source-mapfonte
Sei que essa é uma pergunta antiga, mas ultimamente tenho enfrentado um problema semelhante ao tentar decorar alguns métodos do React Component, para fins de depuração. Como as pessoas já disseram,
arguments.caller
earguments.callee
são proibidas no modo estrito, que provavelmente está ativado por padrão na transpilação do React. Você pode desativá-lo ou eu pude criar outro hack, porque em React todas as funções de classe são nomeadas, você pode realmente fazer isso:fonte
Isso funcionou para mim.
Código do teste:
fonte
Eu tive um problema semelhante e resolvi-o da seguinte maneira:
Esse código implementa, de uma maneira mais confortável, uma resposta que eu já li aqui no início desta discussão. Agora eu tenho uma função de membro recuperando o nome de qualquer objeto de função. Aqui está o script completo ...
fonte
Se eu entendi o que você queria fazer, é isso que faço dentro de um construtor de funções.
fonte
Isso funcionará no ES5, ES6, em todos os navegadores e funções de modo estrito.
Veja como fica com uma função nomeada.
Veja como fica com uma função anônima.
fonte
at myName (<anonymous>:2:15)
Firefox:@debugger eval code:3:3
veja aqui: http://www.tek-tips.com/viewthread.cfm?qid=1209619
parece ser adequado para suas necessidades.
fonte
você pode usar o Error.stack para rastrear o nome da função e a posição exata de onde você está.
Veja stacktrace.js
fonte
Maneira fácil de obter o nome da função de dentro da função que você está executando.
fonte
this
basicamente pode ser qualquer coisa. tente(function(){console.log(this.name);}).bind({name: "put basically anything here even an object maybe a 1TB string maybe a class definition"})()