Antonio,
eu editei o seu código para melhorar a legibilidade ok?
1 - Sobre o seu erro na linha 22
Você vê no código que você mandou da segunda vez onde tem o comentário
//monta paciente
Em baixo dele você vai ter colocar o código que monta o paciente, o método ficara assim:
percorreArray(pacientes, function(trAtual) {
//monta paciente
var paciente = montaPaciente(pacientes[0]),
imcTd = trAtual.getElementsByClassName("info-imc")[0];
var imc = paciente.pegaImc(); // pega o imc do paciente atual
imcTd.textContent = imc; // atualiza imc
console.log(imc); // imprime o imc do paciente atual
});
Isso deve resolver esse problema.
Agora sobre sua primeira dúvida:
2 - Sobre os arquivos javascript
Os arquivos são colocados em sequência no html pois é ele quem vai puxar o javascript e interpretar o seu conteúdo para deixa-lo disponível para uso, a cada arquivo importado ele já vai processando ele antes de chamar o próximo.
A ordem dos arquivos importa pois se o script B depende de algo que está no script A, o script A deve ser interpretado pelo browser como eu descrevi acima e quando o B for carregado ele vai conhecer o que tinha em A, (ok?).
A divisão de arquivos e funções é para melhorar a legibilidade e o reaproveitamento do código na maioria dos casos, porém nada impede de você fazer toda a regra em uma função só dentro do html mesmo (porém isso não é muito legal).
Na maioria das vezes veremos páginas que tem todos os seus scripts "especificos" em um único arquivo Javascript e quando há algo que você quer utilizar em todas as outras páginas você vai colocando isso em outros Javascripts que serão importados nas outras páginas (mas não se preocupe isso você vai pegando a manhã com o tempo, em outros cursos da trilha html você vai ver o que eu acabei de falar).
No caso da divisão do curso ela foi somente para dividir melhor quais as regras que estão sendo aplicadas, normalmente você não vai ter arquivos tão específicos é mais por organização mesmo (no caso do curso!).
3 - Sobre o comportamento
De uma olhada na declaração da função "percorreArray":
function percorreArray(nossosTrs, comportamento){
Viu que você recebe dois parâmetros nela (nossosTrs e comportamento)?
Então, dentro da função quando você trabalhar com esses parâmetros você estará apelidando eles com esse nomes que você colocou na declaração do método.
Logo quando você faz isso:
percorreArray(pacientes, function(trAtual) {
//fiquei com preguiça de copiar o resto do código :D
}
você na verdade está chamando a "function percorreArray" e passando para ela a variável "pacientes" e criando uma nova função
"function(trAtual)" que está sendo apelidada dentro da percorreArray de "comportamento" assim como pacientes vai ser apelidado de nossosTrs (porém somente dentro da função percorreArray).
Espero ter ajudado.
Att.