Entendo passar uma função para outra como retorno de chamada e executá-la, mas não estou entendendo a melhor implementação para fazer isso. Estou procurando um exemplo muito básico, como este:
var myCallBackExample = {
myFirstFunction : function( param1, param2, callback ) {
// Do something with param1 and param2.
if ( arguments.length == 3 ) {
// Execute callback function.
// What is the "best" way to do this?
}
},
mySecondFunction : function() {
myFirstFunction( false, true, function() {
// When this anonymous function is called, execute it.
});
}
};
No myFirstFunction, se eu retornar um novo retorno de chamada (), ele funcionará e executará a função anônima, mas essa não parece a abordagem correta para mim.
arguments
não é um array, você ainda pode fazer referência ao seu comprimento comoarguments.length
- experimente. Esta propriedade refere-se ao número de argumentos realmente transmitidos e não necessariamente ao número de parâmetros na assinatura da função.Respostas:
Você pode apenas dizer
Como alternativa, você pode usar o
call
método se desejar ajustar o valorthis
dentro do retorno de chamada.Dentro da função
this
seria o quenewValueForThis
for.fonte
Você deve verificar se o retorno de chamada existe e é uma função executável:
Muitas bibliotecas (jQuery, dojo etc.) usam um padrão semelhante para suas funções assíncronas, assim como o node.js para todas as funções assíncronas (o nodejs geralmente passa
error
edata
para o retorno de chamada). Olhar para o código fonte ajudaria!fonte
callback
para string e depois verifica seu tipo? Isso melhorará o desempenho? É como verificar o tipo, verificar se o booleano convertido retorna true e, em seguida, verificar seu tipo novamente e testá-lo com a string ... Você poderia explicar o porquê?typeof(callback)
conseguiria isso para você?typeof(null) === "Object"
,typeof("undefined") === "undefined"
callback
não está sendo convertido para uma string, seu tipo está sendo verificado para verificar se é uma função antes de ser chamada. O código presumivelmente aceitacallback
como argumento e é incerto que o argumento seja de um tipo que pode ser chamado - ou talvez os argumentos sejam de vários tipos na tentativa de fornecer uma forma de polimorfismo em que o código possa reagir de maneira diferente atypeof
argumentos diferentes .Existem 3 possibilidades principais para executar uma função:
O método escolhido depende se:
Documentos para Function.call , Function.apply
fonte
Os retornos de chamada são sobre sinais e "novo" é sobre a criação de instâncias de objetos.
Nesse caso, seria ainda mais apropriado executar apenas "callback ();" do que "retornar novo retorno de chamada ()" porque você não está fazendo nada com um valor de retorno de qualquer maneira.
(E o teste argument.length == 3 é realmente desajeitado, fwiw, é melhor verificar se o parâmetro de retorno de chamada existe e é uma função.)
fonte
a implementação adequada seria:
isso torna o parâmetro de retorno de chamada opcional.
fonte
Você pode usar:
O exemplo abaixo é um pouco mais abrangente:
fonte
Aqui está um exemplo básico que explica a
callback()
função em JavaScript:JSFiddle
fonte
fonte