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

Function obtemPacienteDoFormulario nao funciona

Ola pessoal!

Na primeira parte do exercicio, meu codigo ficou dessa forma:

var botaoAdicionar = document.querySelector('#adicionar-paciente');

function obtemPacienteDoFormulario() {

    var form = document.querySelector('#form-adiciona');

    var paciente = {
        nome: form.nome.value,
        peso: form.peso.value,
        altura: form.altura.value,
        gordura: form.gordura.value
    }

    return paciente;
}

botaoAdicionar.addEventListener('click', function(){
    event.preventDefault();

    obtemPacienteDoFormulario();

    var pacienteTr = document.createElement('tr');

    var nomeTd = document.createElement('td');
    var pesoTd = document.createElement('td');
    var alturaTd = document.createElement('td');
    var gorduraTd = document.createElement('td');
    var imcTd = document.createElement('td');

    nomeTd.textContent = paciente.nome;
    pesoTd.textContent = paciente.peso;
    alturaTd.textContent = paciente.altura;
    gorduraTd.textContent = paciente.gordura;
    imcTd.textContent = calculaImc(peso, altura);

    pacienteTr.appendChild(nomeTd);
    pacienteTr.appendChild(pesoTd);
    pacienteTr.appendChild(alturaTd);
    pacienteTr.appendChild(gorduraTd);
    pacienteTr.appendChild(imcTd);

    var tabela = document.querySelector('#tabela');
    tabela.appendChild(pacienteTr);

})

E esperava que, ao chamar a funcao anonima com o clique no botao adicionar, a funcao obtemPacienteDoFormulario fosse selecionar o formulario com a var form, criar e retornar o objeto para dentro da funcao anonima.

Mas nao funcionou. Ao inves disso, o novo paciente foi adicionado sem nome, peso, altura e gordura, e com o imc do paciente anterior.

Por que isso aconteceu?

6 respostas

Olá Anderson!

Isso aconteceu porque a variável paciente está definida dentro do escopo da função obtemPacienteDoFormulario.

A variável paciente usada em nomeTd.textContent = paciente.nome; e nas linhas seguintes não está definida dentro da função anônima do evento click.

Acredito que a solução mais simples no momento como está o código é só fazer

var paciente = obtemPacienteDoFormulario();

Abraço,

Consegui fazer funcionar colocando a variavel paciente antes da chamada da funcao:

var paciente = obtemPacienteDoFormulario();

E colocando os valores corretos na funcao calculaImc:

imcTd.textContent = calculaImc(paciente.peso, paciente.altura);

Mas agora estou com outra duvida.

Por que devemos colocar a variavel paciente pra funcao obtemPacienteDoFormulario trazer os valores do objeto pra dentro da funcao anonima?

edit: Escrevi essa mensagem enquanto voce respondia, Olavo.

Obrigado pela resposta!

:)

Recomendo a leitura do MDN web docs Escopo da função. https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/Fun%C3%A7%C3%B5es#Function_scope Com certeza essa documentação pode explicar com melhores exemplos do que eu e te redicionar também para outros tópicos similares da explicação.

Certo. Nao da pra acessar uma variavel que esta dentro de uma funcao de nenhum lugar a nao ser de dentro da propria funcao.

Mas entao o que acontece quando eu coloco a variavel paciente no retorno da funcao obtemPacienteDoFormulario?

Sao enviados so os valores, mas nao tem como acessa-los porque nao tem uma variavel pra guarda-los?

solução!

Isso! A função retorna o valor do tipo objeto. E como não guardou o retorno da função em uma nova variável então não tem como acessar as variáveis de dentro do escopo do função invocada.

Confuso! Hehe. E é só o princípio. Irá vir mais situações como outras declarações de variáveis com let e const, Arrow functions, bind. Mas acredito que o mais importante é estudar sobre escopo de variável pois é um fundamento de programação.

Abraço!

Confuso mesmo, mas to entendendo melhor agora. E vou seguir sua dica de estudar sobre escopo variavel tambem.

Muito obrigado por ter me ajudado!

Abraco