Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

chamando um função dentro de outra função

Por que que a função removeLinha() está sendo chamada sem os parênteses. Uma das coisas que pensei é porque ela está sendo dentro de outra função, mas se não estou enganado nas outras linguagens, como Java ou C, o parênteses permanece.

function inserePlacar() {
  var corpoTabela = $(".placar").find("tbody"); //selecionando o elemento com a class placar e pegando o seu elemento filho tbody
  var usuario = "Geovane";
  var numPalavras = $("#contador-palavras").text(); //pegando a quantidade de palavras digitadas

  var linha = novaLinha(usuario, numPalavras);
  linha.find(".botao-remover").click(removeLinha); //por que sem ()??

  corpoTabela.append(linha); // adicionando a linha na tabela
}

function removeLinha(event) {
  event.preventDefault();
  $(this).parent().parent().remove();
}

Outra dúvida é quanto a inserção dos scripts no HTML. A ordem de cada script não importa?

  <script src="js/jquery.js"></script>
    <script src="js/main.js"></script>
    <script src="js/placar.js"></script>
    <script src="js/jogo.js"></script>
4 respostas

Fala Geovane,

Tranquilo?

Então, quando você escreve um código que chama uma função sem parenteses na verdade você não está chamando a função, e sim falando que quando aquela ação foi acionada, ela executará a função x, exemplo:

$("button").click(funcao);

Você está dizendo para o seu código o seguinte:

Quando a ação click do elemento da seleção button foi acionada, execute a função funcao, e neste caso não tem parâmetros, apesar da função receber o event, pois é um parâmetro padrão, assim como o this que recebe o elemento DOM do botão.

Espero ter ajudado e não complicado mais hehe.

Abraços!

executar para mim significa chamar hahaha , mas acho que entendi. Só faltou tu responder a parte dos scripts. Por exemplo, sei que o jquery precisa vir antes dos demais, mas os outros parece não ter essa restrição. Parece que é tratado tudo como único arquivo, mas não tenho certeza.

solução!

Olá, a ordem dos scripts importa. Mas vai depender do seu código. Se importei primeiro o scriptA.js e em seguida scriptB.js, caso meu scriptA.js dependa de uma função que foi definida no scriptB.js, na execução do código haverá um erro onde a função que você tentou executar não está definida.

Em relação à primeira dúvida, JavaScript é uma linguagem que também traz o paradigma funcional, uma função em JS é um cidadão de primeiro nível, é um valor, e assim como qualquer valor, pode ser passado como argumento, retornado, armazenado em estruturas de dados, etc.

No código: elemento.click(removeLinha) você não está chamando ou executando a função removeLinha, você está passando ela como argumento do método click, como se fosse qualquer valor, como um número, string, objeto...

JavaScript também é uma linguagem assíncrona, o que significa que em muitos casos ela não vai travar esperando o resultado de uma operação demorada, por exemplo para fazer uma requisição na rede. Exemplificando:

Acesso a dados na rede linguagem síncrona:

dados = requisicao('http://dados.com/vendas')
mostra(dados)
mostra('FIM')

Repare que a requisição será feita, e a chamada bloqueará a execução do programa até que os dados sejam retornados e possam ser consumidos. Primeiro os dados serão mostrados, em seguida a mensagem "FIM".

Acesso a dados na rede linguagem assíncrona:

funcao mostraNaTela(dados) {
    mostra(dados)
}

requisicao('http://dados.com/vendas', mostraNaTela)
mostra('FIM')

Primeiro declaramos uma função que deve receber dados como argumento, quando ela for chamada, mostrará os dados que recebeu.

Fazemos uma requisição, mas neste caso não estamos retornando o resultado para uma variável, isto porque essa função não vai esperar o resultado para prosseguir com a execução. Você chamou a função requisicao, e ela retorna imediatamente sem os dados, desta maneira seu programa não bloqueia, assim será mostrado na tela "FIM".

Como segundo argumento da função requisicao, passamos uma função. Quando os dados já estiverem prontos para serem consumidos, a função requisicao saberá chamar de volta a sua função mostraNaTela e passará o resultado como argumento para mostraNaTela.

Neste segundo caso, primeiro será mostrado na tela "FIM" e em seguida (caso não haja erro) os dados.

Geralmente chamamos essa função que passamos como argumento de callback, pois ela será chamada de volta.

Em relação à função click, é mais ou menos isso que acontece, ela vai adicionar sua função como ouvinte de eventos de clique naquele elemento, quando o elemento for clicado ele vai emitir um evento, sua função como ouvinte será chamada já recebendo um objeto event como argumento.

Lembrando que você pode passar essa função de argumento como uma função anônima, sem precisar declará-la:

linha
  .find('.botao-remover')
  .click(function (ev) {
    ev.preventDefault()

    $(this).parent().parent().remove()
  })

Excelente. Obrigado Pedro.