Como você sabe se uma função em JavaScript está definida?
Eu quero fazer algo assim
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
Mas isso me dá um
retorno de chamada não é uma função
erro quando o retorno de chamada não está definido.
javascript
reflection
Aaron Lee
fonte
fonte
Todas as respostas atuais usam uma string literal, que eu prefiro não ter no meu código, se possível - isso não acontece (e fornece um significado semântico valioso para inicializar):
Pessoalmente, tento reduzir o número de strings penduradas no meu código ...
Além disso, embora eu saiba que
typeof
é um operador e não uma função, há pouco dano ao usar a sintaxe que a faz aparecer como a última.fonte
isFunction(not_defined))
, ondenot_defined
é o nome da função que não está definido e FireBug retornounot_defined is not defined
que é correto, mas a sua função deve retornar falso e não gerar erro ...not_defined
para passar seu valorisFunction()
e não consegue resolvê-lo. Nada pode ser feito na definição deisFunction()
para resolver este problema.isFunction
e faça exatamente(typeof no_function == typeof Function)
.typeof(Function())
porque Function é uma função; mas o mesmo acontece com Array, Object e outros protótipos internos (por falta de um termo melhor). Se você estivesse verificando uma matriz, não usaria,typeof(array) === typeof(Array)
por exemplo; você usariatypeof(array) === typeof(Array())
porque realmente precisa avaliar a função se estiver sendo cuidadoso e consistente.Note-se que retorno de chamada (por si só) avalia que
false
se éundefined
,null
,0
, oufalse
. Comparando comnull
é excessivamente específico.fonte
callback
avaliado como um valor "falso-y", seu tipo de nunca poderá ser "função".Esses métodos para saber se uma função é implementada também falham se a variável não estiver definida, por isso estamos usando algo mais poderoso que suporta o recebimento de uma string:
fonte
typeof window.doesthisexist
vez dedoesthisexist
. No entanto, o uso de eval (que: é ruim), como mostrado, funcionará apenas com funções nomeadas - isso não funcionaria com o caso de uso da pergunta.Novo no JavaScript Não tenho certeza se o comportamento mudou, mas a solução dada por Jason Bunting (6 anos atrás) não funcionará se a função FunctionFun não estiver definida.
Isso gerará um
ReferenceError: possibleFunction is not defined
erro quando o mecanismo tentar resolver o símbolo possibleFunction (conforme mencionado nos comentários da resposta de Jason)Para evitar esse comportamento, você só pode passar o nome da função que deseja verificar se ela existe. assim
Isso define uma variável para ser a função que você deseja verificar ou o objeto vazio, se não estiver definido, evitando assim os problemas mencionados acima.
fonte
Experimentar:
fonte
fonte
fonte
if(typeof Function === typeof callback)...
? :)typeof
retorne algo diferente mais tarde (talvez "Function" em vez de "function"), devido a uma nova / diferente implementação de JavaScript - parece que seria menos provável que uma implementação nova / diferente interromperia atypeof Function === typeof callback
verificação porque deveria ser a mesma no nível semântico.fonte
eu devo fazer
Eu sei que há uma resposta aceita, mas ninguém sugeriu isso. Não tenho muita certeza se isso se encaixa na descrição do idiomático, mas funciona para todos os casos.
Nos mecanismos JavaScript mais recentes,
finally
pode ser usado um.fonte
typeof callback
assim mesmo.accepted_types.indexOf(typeof value) !== -1
se ela está em uma variedade de tipos. Nesta situação, as exceções seriam proibitivas em minha opinião.Tente o seguinte:
fonte
Se você olhar a fonte da biblioteca @Venkat Sudheer Reddy Aedama mencionada, underscorejs, poderá ver o seguinte:
Esta é apenas a minha DICA, DICA da resposta:>
fonte
Experimentar:
fonte
Se você usa http://underscorejs.org , tem: http://underscorejs.org/#isFunction
fonte
Eu estava procurando como verificar se uma função jQuery foi definida e não a encontrei facilmente.
Talvez possa precisar;)
fonte
type0f($.datepicker) !== undefiled
outra forma seráobject
Se
callback()
você está chamando não apenas uma vez em uma função, você pode inicializar o argumento para reutilização:Por exemplo:
A limitação é que ele sempre executará o argumento de retorno de chamada, embora seja indefinido.
fonte
Para funções globais, você pode usar este em vez de
eval
sugerido em uma das respostas.Você pode usar
global.f instanceof Function
também, mas afaik. o valor deFunction
será diferente em quadros diferentes; portanto, ele funcionará apenas com um aplicativo de quadro único corretamente. É por isso que costumamos usartypeof
. Observe que em alguns ambientes também pode haver anomaliastypeof f
, por exemplo, no MSIE 6-8, algumas das funções, por exemplo,alert
tinham o tipo "objeto".Por funções locais, você pode usar o da resposta aceita. Você pode testar se a função é local ou global também.
Para responder à pergunta, o código de exemplo está funcionando para mim sem erros nos navegadores mais recentes, então não tenho certeza de qual era o problema:
Nota: eu usaria em
callback !== undefined
vez decallback != null
, mas eles fazem quase o mesmo.fonte
A maioria, senão todas as respostas anteriores, têm efeitos colaterais para invocar a função
aqui melhores práticas
você tem função
fonte
Se você deseja redefinir funções, é melhor usar variáveis de função, definidas em sua ordem de ocorrência, uma vez que as funções são definidas globalmente, independentemente de onde elas ocorram.
Exemplo de criação de uma nova função que chama uma função anterior com o mesmo nome:
fonte
Isso funcionou para mim
fonte
Solução de uma linha:
fonte