Tenho algumas funções que ocasionalmente (nem sempre) recebem um retorno de chamada e o executam. Verificar se o retorno de chamada está definido / função é um bom estilo ou existe uma maneira melhor?
Exemplo:
function save (callback){
.....do stuff......
if(typeof callback !== 'undefined'){
callback();
};
};
javascript
coding-style
callback
henry.oswald
fonte
fonte
typeof callback !== undefined
assim deixar de fora o'
save()
? Isso não gerará um erro ou aviso de linting porque um argumento está faltando? Ou está perfeitamente ok e o callback é simplesundefined
?Respostas:
Eu pessoalmente prefiro
typeof callback === 'function' && callback();
O
typeof
comando é duvidoso, no entanto, deve ser usado apenas para"undefined"
e"function"
O problema do
typeof !== undefined
é que o usuário pode passar um valor que está definido e não uma funçãofonte
typeof
não é duvidoso. É vago às vezes, mas eu não diria que é duvidoso. Porém, concordou que, se você for chamar o retorno de chamada como uma função, é melhor verificar se é realmente uma função e não, você sabe, um número. :-)"object"
95% das vezes.typeof
não causa boxe.typeof "foo"
é"string"
, não"object"
. Na verdade, é a única maneira real de saber se está lidando com um primitivo ouString
objeto string . (Talvez você esteja pensando emObject.prototype.toString
, o que é muito útil , mas causa boxe.)&&
propósito, uso maravilhosamente idiomático de ..toString
é adorável para encontrar o[[Class]]
.Você também pode fazer:
É especialmente útil se você usar o
callback
em alguns lugares.Além disso, se você estiver usando
jQuery
, você já tem uma função como essa, é chamada $ .noopfonte
callback = callback || function(){};
function save (callback=noop) { ...
Simplesmente faça
Eu prefiro chamar o retorno de chamada, se fornecido, não importa o tipo. Não deixe que ele falhe silenciosamente, para que o implementador saiba que transmitiu um argumento incorreto e possa corrigi-lo.
fonte
ECMAScript 6
fonte
Em vez de tornar o retorno de chamada opcional, basta atribuir um padrão e chamá-lo de qualquer maneira
Quando usado
Esse estilo é chamado de estilo de passagem de continuação . Aqui está um exemplo real
combinations
, que gera todas as combinações possíveis de uma entrada ArrayComo
combinations
é definido no estilo de passagem de continuação, a chamada acima é efetivamente a mesmaTambém podemos passar uma continuação personalizada que faz outra coisa com o resultado
O estilo de aprovação de continuação pode ser usado com resultados surpreendentemente elegantes
fonte
Fiquei tão cansado de ver o mesmo trecho repetidamente que escrevi isto:
Eu tenho centenas de funções fazendo coisas como
como queiras...
Eu sou cético em relação a toda a estratégia "certifique-se de que funcione". Os únicos valores legítimos são uma função ou falsos. Se alguém passar um número diferente de zero ou uma string não vazia, o que você vai fazer? Como ignorar o problema o resolve?
fonte
save( { callback : confirmProfileSaved, priority: "low" })
Uma função válida é baseada no protótipo de Função, use:
para ter certeza de que o retorno de chamada é uma função
fonte
Se o critério para executar o retorno de chamada for definido ou não, você está bem. Além disso, sugiro verificar se é realmente uma função adicional.
fonte
Eu mudei para o script de café e descobri que os argumentos padrão são uma boa maneira de resolver este problema
fonte
Isso pode ser feito facilmente com o ArgueJS :
fonte