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

Função, argumento e return

Eu fiquei com dúvida na metade do video, na parte que começa a criar várias funções.

Teve um exercicio que monta essa função:

function montaPaciente(trDoPaciente){
    var nome = trDoPaciente.getElementsByClassName("info-nome")[0].textContent;
    var altura = trDoPaciente.getElementsByClassName("info-altura")[0].textContent;
    var peso = trDoPaciente.getElementsByClassName("info-peso")[0].textContent;
    var paciente = {
        nome : nome,
        altura: altura,
        peso : peso,
        pegaImc : function(){
            return peso/(altura*altura);
        }
    }
    return paciente;
}

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

for(var posicaoAtual = 0; posicaoAtual <= pacientes.length(); posicaoAtual++){
    var trDoPaciente = pacientes[posicaoAtual];
    var trDoImc = trDoPaciente.getElementsByClassName("info-imc")[0];
    var paciente = montaPaciente(trDoPaciente);
    var imc = paciente.pegaImc();
    trDoImc.textContent = imc;
    console.log(imc);
}

Porque precisa ser:

 return peso/(altura*altura);

Sem o return não funciona?

E porque precisa do return de paciente? Quando eu devo utilizar o return?

Porque precisa criar uma função de array? Não tem como pegar só a variavel nome que está no objeto e imprimir o nome?

15 respostas

Gisesonia vou tentar responder. Primeiro vou colar o seu código aqui para visualizar melhor

function montaPaciente(trDoPaciente){ 
    var nome = trDoPaciente.getElementsByClassName("info-nome")[0].textContent; 
    var altura = trDoPaciente.getElementsByClassName("info-altura")[0].textContent; 
    var peso = trDoPaciente.getElementsByClassName("info-peso")[0].textContent; 
    var paciente = { nome : nome, altura: altura, peso : peso, 
                    pegaImc : function(){ return peso/(altura*altura); } 
                    } 
    return paciente; 
}

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

for(var posicaoAtual = 0; posicaoAtual <= pacientes.length(); posicaoAtual++){ 
    var trDoPaciente = pacientes[posicaoAtual]; 
    var trDoImc = trDoPaciente.getElementsByClassName("info-imc")[0]; 
    var paciente = montaPaciente(trDoPaciente); 
    var imc = paciente.pegaImc(); 
    trDoImc.textContent = imc; 
    console.log(imc); 
}

Agora as repostas, na ordem de suas perguntas, ok?

Porque precisa ser: return peso/(altura*altura); Sem o return não funciona?

Não funciona sem o return peso/(altura*altura);

pegaImc é o "apelido" da função anônima que é chamada na linha var imc = paciente.pegaImc() justamente para atribuir valor a variável imc;

O imc é calculado dentro da função, mas a chamada é fora dela. Se não tiver o return, não tem porque chamar a função, pois nada será retornado! a variável imc não vai ter o valor atribuído a ela.

E porque precisa do return de paciente? Quando eu devo utilizar o return?

Precisa do return paciente porque estamos montando os pacientes, um a um. Assim que montou o paciente ele é retornado. Para cada paciente retornado é feito o cálculo do imc, justamente com base no paciente que foi retornado (return).

O return é usado sempre que a função chamada deve devolver algum valor. Se a função calcula um valor e você precisa usar este valor após a chamada, este valor vem no return.

Porque precisa criar uma função de array? Não tem como pegar só a variavel nome que está no objeto e imprimir o nome?

A utilização do array serve para termos todos os dados do paciente dentro de um mesmo lugar. Fica mais fácil manusear estes dados.

Se você não quisesse o array, deveria retornar todos os valores em separado, como segue:

return nome, altura, peso, imc;

Obrigada.

A última pergunta, acho que eu não expliquei direito, o que eu quis dizer é sobre a divisão de funções para obter os nomes dos pacientes, como estava a função no inicio, não tinha como puxar somente os nomes dos pacientes, sem dividir em várias funções? Exemplo: paciente.nome?

Não sei se compreendi direito a sua dúvida.

Acontece que estamos pegando TODOS os pacientes e a única forma de armazenar e tratá-los seria dentro de uma coleção. No caso o array.

Para fazer paciente.nome você já deve estar com o objeto paciente "montado". Na verdade faz exatamente isto. Varre todos os pacientes e depois trata bem como você quer. Só que o que interessa neste ponto é o imc (e não o nome).

E no código: var imc = paciente.pegaImc(); neste ponto você poderia usar paciente.nome também...

Esperto ter compreendido sua dúvida e , melhor ainda, se esclareci.

Gisesonia, você tem alguma noção do que é um objeto e do que é programação orientada a objeto?

Tenho a impressão que é isto que está te "atrapalhando".

Dei uma olhada no seu perfil. Vi que você até já terminou o curso de javascript, mas continua aqui postando dúvidas.Eu gostei disto, pois tenho um lado meio "professor". E, como tal, gosto de ir a fundo nas dúvidas, se eu sinto que posso ajudar.E eu acho que este é o caso...

Pra um curso de javascript destinado a iniciantes me parece pesado partir pro caminho de orientação a objetos, mas não acho inválido.

Por isto a minha pergunta se você conhece.

Eu imaginava o curso cheio de comandos de javascript, aquela massa toda de informação e no meu caso foi muito legal o curso desta forma, mas pode ser que não seja para todos.

Vou gostar muito se me responder. E acho que os professores do ALURA devem ficar atentos a este papo - se ele rolar :)

Sidnei, pelo que entendi da pergunda da Gisesonia foi o seguinte:

porque precisa de funcao de array para pegar o nome? nao da pra pegar o nome direto e imprimir?

Nao precisa. Voce pode pegar o nome dentro do loop e imprimir normalmente.

O objetivo é didático. Te mostra que é possível utilizar funções "genéricas", passadas como parametros. Isso é bastante utilizado e útil.

Ariel, a meu ver, você está apenas reforçando o que eu disse antes. Pode sim, imprimir. Mas imprimir para quê?

Como a Gisesonia sugere a utilização de paciente.nome, pressupõe-se que o objeto paciente esteja instanciado (a grosso modo, com os valores atribuídos).

Eu entendo que o que estamos fazendo aqui não é a "impressão" de nome. Estamos montando os pacientes e devolvendo os pacientes para quem chamou a função montaPaciente().

Quem chamou pode fazer o que quiser considerando que: Cada objeto paciente tem 3 atributos (nome, altura e peso) e um método (pegaImc).

A Gisesonia lançou num de seus posts que está apenas "corrigindo" exercícios. Acho que já tem assunto sobrando sobre este tópico.

Gisessonia agora é sua vez: o que acha do que estamos falando?Poderia concluir o assunto com algum posicionamento ?

Apenas mais um detalhe. O mais importante aqui é que estamos montando um código reutilizável. Outras funcionalidades que precisarem dados do paciente, podem chamar esta mesma função.

Gisesonia, ainda aguaro o seu posicionamento, ok? (rs)

Também fiquei um pouco perdido em meio a tudo isso, mas é realmente como o Sidnei falou, acho que estou penando por não conhecer bem orientação a objetos. E realmente os professores do Alura devem estar analisando isso melhor, pois estou passando por este módulo sem uma boa compreensão de javascript.

Terei que buscar em outros lugares o que achei que aprenderia aqui ??? FICA A PERGUNTA

Caro Leonardo, nenhum curso você vai aprender 100% o assunto, sempre vai ficar falhas de entendimento por falta de conhecimento em algum, tem muitos cursos presenciais caros que eu fiz que não ensinaram algumas features que eu aprendi aqui, e outras features que eu aprendi lá que aqui não passou, você terá que pesquisar em outros lugares em qualquer curso que você for fazer, e assim que você irá aumentar seu conhecimento, o único lugar que tem tudo é a documentação da própria linguagem que no caso um bom seria : http://www.w3schools.com/js/default.asp, espero que você tenha um bom estudo e um pré-requisito de programador é ser auto-didata.

  • Leonardo, se você precisar de algum auxílio, não se acanhe. É só postar.

Um conselho específico para este curso de js é acompanhar no browser, inspecionar elementos, fazer prints na console (console.log) e ver o conteúdo das variáveis.

  • Além, é claro, do conselho do Alan de realmente procurar noutras fontes.Mas não procure por features, ok? Procre por características, no nosso bom português, rs

Também fiquei super perdido na didática, sem contar que parece q a pessoa que faz as perguntas e respostas do curso não é a mesma que faz dá aula no vídeo, então acontece de ter nomenclaturas diferentes que tem dificultado bastante! Vou ter q rever pra tentar compreender novamente!

Desculpa gente, eu não estava conseguindo acessar mais o curso, por causa do trabalho, vou tentar acessar mais vezes. Vou responder por etapas:

1- Tenho conhecimento de Orientação a objetos, mas já faz um tempo que eu aprendi e quando eu aprendi foi com Pascal (não lembro muita coisa), mas sempre que eu tenho uma dúvida assim me falam, isso é lógica ou falta de conceitos de orientação a objetos, já refiz curso de lógica e revi conceitos de orientação a objetos, mas a dúvida é na linguagem mesmo. Há 2 atrás eu fiz um curso de OOP com o Flash e certas coisas que eu fazia com actionscript, não se aplicam da mesma forma no javascript, mesmo porque eu pensava muito no Movieclip, botão... Por exemplo, para imprimir algo na tela nem sempre é necessário o return.

2 - Eu vou ter que rever o curso, mas é que eu tinha me perdido na criação das funções,acho que é o flash que está me confundindo, porque eu pensava nos objetos que ficavam na biblioteca do flash. É mais visual.

3 - Acho que a minha pergunta foi mal formulada, a minha dúvida surgiu quando começou a dividir em funções, porque sempre tem que criar um argumento porque não existe determinada variável dentro da função o pacientAtual que foi passado para calculaImc e depois não tinha o imc e criou ele para receber o valor da função, me perdi nesse racicinio de criação das variáveis e conforme vai mudando o racicínio ele tira ou coloca argumento.

4 - A minha dúvida foi na criação do imprime.js, o que eu queria dizer é que se não tinha uma forma de puxar o nome dos pacientes da função calcula-imc.js, sem ter que fazer o loop novamente na função imprime.js, porque eu peguei os dados na outra função, mas eu preciso puxar tudo de novo em outra função? Isso que eu não entendi.

Obigada pelas respostas, o pessoal daqui participa mesmo.

Revi o video e vi que ele faz um loop para tudo, altero minha dúvida, não entendi porque ele criou o comportamento(). Esse comportamento está chamando a função do imprime-nome.js? No que eu utilizei no flash, não era necessário chamar uma função dentro da outra dessa forma, por isso a minha dúvida.

solução!

Vou tentar dar uma ajuda neste fórum.

Gisesonia, pelo que li, acho que seria interessante vc entender melhor sobre o escopo de variáveis dentro de funções. Isso vale para qualquer linguagem que já vi: Java, PHP, Javascript. Uma função não necessita sempre retornar(return) alguma coisa. Vc pode fazer uma função sem retornar nada como vc já disse que fez. Porém é de grande utilidade ter um retorno ao chamar uma função. Entenda que as váriaveis utilizadas somente no escopo de uma função só valem dentro daquela função. Vou tentar dar um exemplo. Suponha que que vc chame uma função com o nome "calculaMedia". Se vc chamou essa função vc quer alguma coisa dela né?. Logo, sua função "calculaMedia" tem que retornar um resultado. Aí Vc pode perguntar: Mas eu só quero imprimir o resultado, então a função não pode imprimir diretor sem precisar retornar nada?. A resposta: é sim. Porém eu te pergunto: Se vc fizesse isso de a função imprimir direto, e quisesse o resultado da média para usar em outra coisa "tipo passar para outra função", vc poderia usar a função "calculaMedia"? A resposta é não, pois a função "calculaMedia" não retornaria um resultado para vc mandar esse resultado para outro canto. Ela só imprime e ponto.

Outra coisa sobre passar uma função como argumento. Isso é coisa do Javascript. Realmente nunca vi em outras linguagens que citei. No exemplo que vc não entendeu, veja que ele é didático para vc entender essa caracteristica, logo esse exemplo poderia ser feito do jeito que vc fez no flash.

Uma dica sobre funções. Realmente vc pode programar em um grande bloco sem precisar de funções, mas isso não é bom. Tente começar a dividir tarefas em seus algoritmos, criando funções. Pegue um algoritmo já pronto em um bloco e tente dividi-lo. Treine isso, pois vc irá precisar muito.

Muito obrigada Welton, entendi o que você quis dizer de retornar e como utilizar, mas eu consegui esclarecer no curso de Jquery 2, fez mais sentido para mim a criação das funções e quando devo retornar um valor.

Nesse curso ele utilizou vários exemplos para explicar diferentes formas de utilização de função, mas realmente me confundiu um pouco.

Obrigada a todos que responderam.