Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Diferença da chamada de uma função com e sem parenteses

Fiz o seguinte código para este exercício:

function montaPaciente(trPaciente){

    var tdNome   = trPaciente.getElementsByClassName("info-nome")[0];
    var tdPeso   = trPaciente.getElementsByClassName("info-peso")[0];
    var tdAltura = trPaciente.getElementsByClassName("info-altura")[0];

    var paciente = {
        "nome"    : tdNome.textContent,
        "peso"    : tdPeso.textContent,
        "altura"  : tdAltura.textContent,
        "pegaImc" : function calculaImc() {

                        if (this.altura != 0) {

                            var imc = this.peso / (this.altura * this.altura);
                            return imc;
                        }
                        else{
                            console.log("A altura deve ser diferente de zero");
                        }    

                    }
    };

    return paciente;
}

function calculaTodosImcs(){

    var trPacientes = document.getElementsByClassName("paciente");

    percorreArray(trPacientes, function (trPaciente){

                                    var paciente = montaPaciente(trPaciente);
                                    var tdImc    = trPaciente.getElementsByClassName("info-imc")[0];
                                    var imc      = paciente.pegaImc();
                                    tdImc.textContent = imc;
                                    console.log(imc);

                                    // para ver algo no console
                                    console.log(paciente.nome);
                                    console.log(paciente.peso);
                                    console.log(paciente.altura);

                                }
                );

}

var botao = document.getElementById("calcula-imcs");
botao.onclick = calculaTodosImcs;

Gostaria de saber porque a linha botao.onclick = calculaTodosImcs; faz com que o cálculo de IMCs seja disparado apenas quando se pressiona o botão Calcular Imcs enquanto que se eu trocá-la para botao.onclick = calculaTodosImcs(); a página ao ser carregada já calcula os IMCs.

Resumindo, qual a diferença entre chamar a função com (botao.onclick = calculaTodosImcs();) e sem (botao.onclick = calculaTodosImcs;) parenteses?

Obrigado

1 resposta
solução!

Olá Joacir,

Ocorre essa situação porque quando executamos:

botao.onclick = calculaTodosImcs();

Estamos dizendo ao nosso navegador para iniciar a função "calculaTodosImcs" assim que for recarregada a página. Ele ignora a atribuição feita ao evento onclick porque estamos chamando uma função diretamente quando adicionamos ()após o nome da função js.

Enquanto no outro caso:

botao.onclick = calculaTodosImcs;

Estamos explicitamente dizendo que ao executarmos o evento onclick no nosso botão ele executará a instrução atribuída que pode ser uma função ou não.

Espero ter ajudado.