Como passo uma função como parâmetro sem que a função seja executada na função "pai" ou usada eval()
? (Desde que eu li que é inseguro.)
Eu tenho isto:
addContact(entityId, refreshContactList());
Funciona, mas o problema é que é refreshContactList
acionado quando a função é chamada, e não quando é usada na função.
Eu poderia contornar isso usando eval()
, mas não é a melhor prática, de acordo com o que li. Como posso passar uma função como parâmetro em JavaScript?
javascript
function
parameters
imperium2335
fonte
fonte
addContact(1, function(id) { console.log(id); });
=
sinal ... emclass myFuncs {
vez declass myFuncs = {
. Você também precisa estar executando em um ambiente que suporte a sintaxe da classe (nem todos os navegadores ainda o suportam). Se você ainda estiver com dificuldades, pode ser mais adequado para uma pergunta totalmente nova, pois seu problema não é sobre a passagem de funções - é a sintaxe geral do ES.Se você deseja passar uma função, basta referenciá-la pelo nome, sem os parênteses:
Mas, às vezes, você pode querer passar uma função com argumentos incluídos , mas não a chama até que o retorno de chamada seja chamado. Para fazer isso, ao chamá-lo, basta envolvê-lo em uma função anônima, assim:
Se preferir, você também pode usar a função aplicar e ter um terceiro parâmetro que é uma matriz de argumentos, como:
fonte
Exemplo 1:
Exemplo 2:
Veja isso
fonte
Para passar a função como parâmetro, basta remover os suportes!
A idéia por trás disso é que uma função é bastante semelhante a uma variável. Em vez de escrever
você também pode escrever
Existem pequenas diferenças entre os dois, mas de qualquer maneira - os dois são formas válidas de definir uma função. Agora, se você definir uma função e atribuí-la explicitamente a uma variável, parece bastante lógico que você pode passá-la como parâmetro para outra função e não precisa de colchetes:
fonte
typeof paramFunc == "function"
, pois se não for possível chamar, você poderá ignorá-lo.Há uma frase entre os programadores de JavaScript: "Eval is Evil", então tente evitá-la a todo custo!
Além da resposta de Steve Fenton, você também pode passar funções diretamente.
fonte
Eu cortei todo o meu cabelo com esse problema. Como não consegui fazer os exemplos acima funcionarem, terminei assim:
E isso está funcionando como um encanto ... pelo que eu precisava pelo menos. Espero que ajude alguns.
fonte
Sugiro colocar os parâmetros em uma matriz e depois dividi-los usando a
.apply()
função Portanto, agora podemos facilmente passar uma função com muitos parâmetros e executá-la de uma maneira simples.fonte
Você também pode usar
eval()
para fazer a mesma coisa.É isso aí. Eu também estava procurando por esta solução e tentei soluções fornecidas em outras respostas, mas finalmente consegui trabalhar com o exemplo acima.
fonte
Aqui está outra abordagem:
fonte
Na verdade, parece um pouco complicado, não é.
get método como um parâmetro:
Você pode fornecer como método de parâmetro:
fonte
As outras respostas fazem um excelente trabalho descrevendo o que está acontecendo, mas uma "pegadinha" importante é garantir que tudo o que você passar seja realmente uma referência a uma função.
Por exemplo, se você passar por uma string em vez de uma função, receberá um erro:
Veja JsFiddle
fonte
Em algum momento em que você precisa lidar com o manipulador de eventos, também precisa passar o evento como argumento, a maioria das bibliotecas modernas como react, angular pode precisar disso.
Preciso substituir a função OnSubmit (função da biblioteca de terceiros) por alguma validação personalizada no reactjs e passei a função e o evento, como abaixo
ORIGINALMENTE
FEITO UMA NOVA FUNÇÃO
upload
e chamado passouonSubmit
e evento como argumentosfonte
Você também pode usar um JSON para armazenar e enviar funções JS.
Verifique o seguinte:
Isso imprimirá 'a'.
O seguinte tem o mesmo efeito com o acima:
O que também tem o mesmo efeito com o seguinte:
E um paradigma de objeto usando Class como protótipo de objeto:
fonte