Respostas:
typeof callback === "function"
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):
function isFunction(possibleFunction) {
return typeof(possibleFunction) === typeof(Function);
}
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.
isFunction(not_defined))
, onde not_defined
é o nome da função que não está definido e FireBug retornou not_defined is not defined
que é correto, mas a sua função deve retornar falso e não gerar erro ...
not_defined
para passar seu valor isFunction()
e não consegue resolvê-lo. Nada pode ser feito na definição de isFunction()
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ê usaria typeof(array) === typeof(Array())
porque realmente precisa avaliar a função se estiver sendo cuidadoso e consistente.
if (callback && typeof(callback) == "function")
Note-se que retorno de chamada (por si só) avalia que false
se é undefined
, null
, 0
, ou false
. Comparando com null
é excessivamente específico.
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:
function isFunctionDefined(functionName) {
if(eval("typeof(" + functionName + ") == typeof(Function)")) {
return true;
}
}
if (isFunctionDefined('myFunction')) {
myFunction(foo);
}
typeof window.doesthisexist
vez de doesthisexist
. 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.
function isFunction(possibleFunction) {
return (typeof(possibleFunction) == typeof(Function));
}
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
var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;
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.
Experimentar:
if (typeof(callback) == 'function')
if ('function' === typeof callback) ...
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 a typeof Function === typeof callback
verificação porque deveria ser a mesma no nível semântico.
typeof(callback) == "function"
eu devo fazer
try{
callback();
}catch(e){};
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.
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:
callback instanceof Function
Se você usa http://underscorejs.org , tem: http://underscorejs.org/#isFunction
_.isFunction(callback);
Se callback()
você está chamando não apenas uma vez em uma função, você pode inicializar o argumento para reutilização:
callback = (typeof callback === "function") ? callback : function(){};
Por exemplo:
function something_cool(text, callback) {
// Initialize arguments
callback = (typeof callback === "function") ? callback : function(){};
alert(text);
if (text==='waitAnotherAJAX') {
anotherAJAX(callback);
} else {
callback();
}
}
A limitação é que ele sempre executará o argumento de retorno de chamada, embora seja indefinido.
Para funções globais, você pode usar este em vez de eval
sugerido em uma das respostas.
var global = (function (){
return this;
})();
if (typeof(global.f) != "function")
global.f = function f1_shim (){
// commonly used by polyfill libs
};
Você pode usar global.f instanceof Function
também, mas afaik. o valor de Function
será diferente em quadros diferentes; portanto, ele funcionará apenas com um aplicativo de quadro único corretamente. É por isso que costumamos usar typeof
. Observe que em alguns ambientes também pode haver anomalias typeof 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.
if (typeof(f) == "function")
if (global.f === f)
console.log("f is a global function");
else
console.log("f is a local function");
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:
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
Nota: eu usaria em callback !== undefined
vez de callback != null
, mas eles fazem quase o mesmo.
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
function myFunction() {
var x=1;
}
//direct way
if( (typeof window.myFunction)=='function')
alert('myFunction is function')
else
alert('myFunction is not defined');
//byString
var strFunctionName='myFunction'
if( (typeof window[strFunctionName])=='function')
alert(s+' is function');
else
alert(s+' is not defined');
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:
A=function() {...} // first definition
...
if (typeof A==='function')
oldA=A;
A=function() {...oldA()...} // new definition
Isso funcionou para mim
if( cb && typeof( eval( cb ) ) === "function" ){
eval( cb + "()" );
}
Solução de uma linha:
function something_cool(text, callback){
callback && callback();
}