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

Varíaveis "const" do loop, função anônima e identificação de tecla.

Boa noite! Estou no capítulo 4 do curso, e fiquei com 3 dúvidas a respeito do código ao final do capítulo:

function tocaSom (idElementoAudio) {
    document.querySelector(idElementoAudio).play();
}

const listaDeTeclas = document.querySelectorAll('.tecla');

for (let contador = 0; contador < listaDeTeclas.length; contador++) {

    const tecla = listaDeTeclas[contador];
    const instrumento = tecla.classList[1];
    const idAudio = `#som_${instrumento}`; //template string
    
    tecla.onclick = function() {
        tocaSom(idAudio);
    }
    
}
  • A primeira dúvida é: Por que declaramos as variáveis dentro do loop como "const" ao invés de "let", sendo que elas mudam de valor a cada iteração? Ou seja, eu entendo que a cada repetição do loop durante a execução do código a variável "tecla", por exemplo, recebe um valor diferente ocupado na memória.

  • A segunda dúvida é: Qual é a necessidade de utilizar a função anônima? Não funcionaria se eu simplesmente chamasse a função "tocaSom" passando o parâmetro "idAudio" recebendo esse valor na "tecla.onclick"? Exemplo:

function tocaSom (idElementoAudio) {
    document.querySelector(idElementoAudio).play();
}

const listaDeTeclas = document.querySelectorAll('.tecla');

for (let contador = 0; contador < listaDeTeclas.length; contador++) {

    const tecla = listaDeTeclas[contador];
    const instrumento = tecla.classList[1];
    const idAudio = `#som_${instrumento}`; //template string
    
    tecla.onclick = tocaSom(idAudio);
    
}
  • A terceira dúvida, e a mais complexa pra mim, cheguei até a ver ela aqui no fórum, mas ainda não consegui entender o funcionamento, é a seguinte: Eu sei que ao reiniciar a página da web, ela renderiza executando o documento main.js, tanto que se vc colocar um "console.log" no final do bloco do loop do for, ele registra no console todas as iterações (do 0 ao 8). Mas na minha cabeça, a repetição do for já acabou após renderizar a página, e quando clicamos no botão de cada som, ele ainda sim consegue identificar o som respectivo, ou seja, entendo que ele consegue passar o "idAudio" correto respectivo a cada som que foi passado na iteração do for, mas como ele faz isso sendo que a repetição terminou e alterou a variável "idAudio" com todos os id's correspondentes de cada repetição do loop? Eu também entendo que a "tecla.onclick" por estar dentro do for ela só funcionaria caso a repetição ainda estivesse acontecendo, mas como ela ja foi finalizada, não entendo como é possível ela funcionar atribuindo o id corresponde ao idAudio quando o usuário clica no botão. Essa é a minha dúvida.

Peço desculpas pelo texto enorme, tentei ser o mais explícito possível com a minha dúvida, ainda que eu tenha sido bastante prolixo. Se alguem puder me ajudar a sanar essas dúvidas ficaria imensamente grato!

1 resposta
solução!

Oi Guilherme, tudo bem?

Vamos às suas dúvidas:

  1. A declaração das variáveis dentro do loop como "const" ao invés de "let" é uma boa prática de programação. Embora o valor das variáveis mude a cada iteração, ao utilizar "const" estamos garantindo que essas variáveis não serão reatribuídas em nenhum momento posterior. Isso ajuda a evitar erros e torna o código mais legível. No caso do seu exemplo, as variáveis "tecla", "instrumento" e "idAudio" são declaradas com "const" porque seus valores não são alterados dentro do loop, apenas são atribuídos uma vez.

  2. A função anônima é utilizada nesse caso para garantir que a função "tocaSom" seja chamada apenas quando o evento de clique ocorrer. Se você simplesmente chamasse a função "tocaSom" passando o parâmetro "idAudio" na linha "tecla.onclick = tocaSom(idAudio);", a função seria executada imediatamente e não quando ocorresse o clique. Ao utilizar a função anônima, você está atribuindo ao evento de clique uma função que será executada somente quando o clique acontecer.

  3. Sua terceira dúvida é bastante interessante. Após a renderização da página, o loop do for já foi finalizado, mas as funções atribuídas ao evento de clique (tecla.onclick) ainda possuem acesso às variáveis declaradas dentro do loop. Isso acontece porque as funções têm acesso ao escopo em que foram criadas, mesmo que esse escopo já tenha sido encerrado. Dessa forma, quando o usuário clica no botão, a função anônima atribuída ao evento de clique é executada e tem acesso ao valor correto de "idAudio" correspondente à iteração em que foi criada. Em resumo, mesmo após o término do loop, quando o evento onclick é acionado, cada função de clique possui sua própria cópia do "idAudio" correto, que foi atribuído durante a iteração do loop. Isso ocorre porque a função anônima carrega consigo uma referência ao "idAudio" no momento em que é atribuída ao evento onclick.

Espero ter ajudado a esclarecer suas dúvidas!

Um abraço e bons estudos.