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

Uso do "this" dentro de objetos e funções

Estou com dúvida acerca do uso do this. Tentei aplicá-lo na seguinte função:

function obtemPacienteDoFormulario(form) {

    var paciente = {
        nome: form.nome.value,
        peso: form.peso.value,
        altura: form.altura.value,
        gordura: form.gordura.value,
        imc: calculaImc(form.peso.value, form.altura.value)
    }

    return paciente;
}

Fazendo dessa forma:

function obtemPacienteDoFormulario(form) {

    var paciente = {
        nome: form.nome.value,
        peso: form.peso.value,
        altura: form.altura.value,
        gordura: form.gordura.value,
        imc: calculaImc(this.peso, this.altura)
    }

    return paciente;
}

Mas estou recebendo como resultado um NaN para o atributo imc. Por que o this não retorna o valor dos atributos do próprio objeto nesse caso?

2 respostas
solução!

Olá, Gabriel, tudo bem?

A palavra-chave this sofre influência do escopo de função no qual está declarada, e não sofre influência de um objeto se ela tiver sido declarada dentro de um.

Ou seja, nesse contexto, o this sofre influência da função obtemPacienteDoFormulario. Mais especificamente, this recebe o valor de quem chamou essa função.

Como a função obtemPacienteDoFormulario foi declarada de forma global, o valor de this dentro dela irá se referir ao objeto window (que é onde ficam todas as declarações feitas de forma global. Você pode testar e escrever no seu código window., e verá no autocomplete que as funções que você declarou aparecem como propriedade de window)

Enfim, essa foi apenas uma explicação mais aprofundada sobre como funciona o this, mas em resumo, ele não será útil nessa situação para se referir ao objeto paciente que você está declarando. O this costuma ser mais útil em situações como funções que são chamadas quando eventos do DOM são disparados, ou quando estamos lidando com classes.

Você pode ler mais informações sobre o this na documentação.

Espero ter ajudado! Abraços e bons estudos :)

Obrigado, Antônio!

Esclareceu minha dúvida ;)