Este portal foi desativado, veja meus outros projetos:

Site da Psicóloga e Psicoterapeuta Bianca Galindo terapia online

quinta-feira, 16 de agosto de 2012

Passando função como parâmetro no JavaScript com Node.JS

Antes de tentar entender o funcionamento do Node.JS temos que compreender uma característica do JavaScript herdada da programação funcional. No JavaScript você pode, por exemplo, passar uma função como parâmetro. Vamos ver alguns exemplos práticos para ver como isso funciona na prática.

Podemos fazer alguma coisa como isso no JavaScript:
function falar(palavra) {
  console.log(palavra);
}
function executar(funcao, valor) {
  funcao(valor);
}
executar(falar, "Oi JavaScript!");
Se executarmos nosso código vamos receber a saída impressa no console Oi JavaScript!. Você pode testar este exemplo utilizando seu prompt de comando. O Node.JS é um ambiente de execução para usar o JavaScript fora do navegador também! Você pode acessar digitando o comando node no seu console e inicia o console interativo (REPL), como no exemplo:

Imagem de uma função como parâmetro no Node.JS no console REPL
Exemplo rodado no terminal do Ubuntu 12.04
Vamos entender o que está acontecendo neste contexto. O que fizemos aqui foi passar a função falar como o primeiro parâmetro da função executar. Isso é bem diferente de passar o valor retornado (return) pela função falar. A função falar, então, se tornou uma variável de nome funcao dentro da função executar, e executar pode chamar a função contida na variável adicionando os parênteses na variável: funcao().

E o que são estes undefined no console? Para cada comando dado no console do Node na linha seguinte é impresso o valor retornado (return) deste comando. Vamos analisar com calma: o primeiro comando foi definir a função falar, após a definição retornou undefined, o segundo comando foi definir a função executar, que também retornou undefined, o terceiro comando que executou a função executar, que executou a função falar contida na variável funcao, que acabou por executar a função console.log que imprime no console uma string, mas a função chamada (executar) em si não tem nenhum valor de retorno, então retornou undefined.

Nós podemos passar uma função como parâmetro para outra função usando seu nome, como foi visto no exemplo. Após entender este conceito veremos no exemplo a seguir que esta é a maneira indireta de se fazer isso, nós não precisamos definir a função para depois passar ela como parâmetro, nós podemos definir e passar a função como parâmetro para outra função no mesmo lugar.
function executar(funcao, valor) {
  funcao(valor);
}
executar( function(palavra) { console.log(palavra)  }, "Oi JavaScript!");
Neste exemplo nós definimos a função que nós queremos passar para executar no lugar onde a função espera receber seu primeiro parâmetro. Aqui nós não precisamos nem dar um nome à função passada, por isso esta função é chamada de função anônima.

Imagem de uma função anônima no Node.JS no console REPL
Exemplo de função anônima no Node.JS
Com estes exemplos podemos observar que no JavaScript é possível passar uma função como parâmetro quando chamamos outra função, e podemos fazer isso atribuindo nossa função à uma variável que pode ser passada, ou simplesmente definindo nossa função bem onde estamos chamando a função que vai recebê-la como parâmetro (usando uma função anônima).

4 comentários:

  1. Funções como objectos (first-class ou high-order functions) não são uma "peculiaridade" do Javascript, mas uma das características da programação funcional, originária do LISP, e também existente em Ruby, Python, Scala, Haskell, Erlang, F#, e até Perl, C, C# e Java (8+). Faltou um pouco de embasamento de JS no artigo.

    O blog aqui é para desenvolvedores de node.js ou iniciantes brincando com jQuery?

    ResponderExcluir
    Respostas
    1. Obrigado pelo comentário, mesmo de forma anônima com certeza seu comentário vai contribuir para esclarecer ainda mais o Post. Quando escrevi peculiaridade do JavaScript era pra ter escrito peculiaridade da programação funcional. Eu realmente não quis entrar em conceitos como first-class ou high-order functions, mas editar o post para ser mais claro.

      Agradeço pelo sr. Anonymous, e sinta-se a vontade para identificar-se a próxima vez que quiser contribuir com este singelo projeto.

      Excluir
  2. Nossa eu não estava entendendo isso, agora ficou claro. É um conceito simples mas pra quem não tem muita prática se torna um pouco difícil.

    Parabéns!

    ResponderExcluir
  3. Legal. e o nodo é todo baseado nisso, Passando funções callback como parametros de chamadas de eventos.

    ResponderExcluir

Este portal foi desativado, veja meus outros projetos:

Site da Psicóloga e Psicoterapeuta Bianca Galindo terapia online