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

[Dúvida] declaração Const x Var

Li em alguns artigos que: Quando não se declara o escopo da variável, ela assume o valor global (ou seja, ela assume que é uma var).

É possível observar que eu cometi um "erro" na linha em que declaro a variável idAudio que não assume o escopo de uma constante mas de uma variavel global. Veja:

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

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

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

    const tecla = listaDeTeclas[i];
    const instrumento = tecla.classList[1];
    idAudio = `#som_${instrumento}`;
    console.log(idAudio);


    listaDeTeclas[i].onclick = function () {
        tocaSom(idAudio);
    }
}

Ao realizar o teste, vi que, apesar que ela possuir seu valor reassinalado a cada loop, conforme mostra o console:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

as teclas possuiam todas o mesmo som: o último valor atribuído à variável idAudio (que seria #som_tecla_tom).

E aí que vem a minha dúvida: POR QUE?

Por que a variável global não guarda o valor de cada som no loop mas a constante sim?

3 respostas

Oi, Amanda

Não importa se vc usar VAR, CONST ou LET, o resultado será o mesmo

Em 2015 foi incluído no JS o CONST e LET.

O VAR foi mantido para manter a compatibilidade de códigos antigos

Porque devemos evitar de usar o var no Java script

Oi Luis! primeiro lugar, obrigada por responder :)

mas o resultado do meu código foi diferente :( Utilizando VAR, o som de todas as teclas foi o mesmo enquanto utilizando CONST, as teclas receberam os sons aos quais pertencem. Lendo o artigo eu entendi a diferenca de se utilizar var, let ou const mas isso não explica pq do resultado ser o mesmo pra todas as teclas quando se utiliza VAR na declaração da variavel. (ou ao menos eu nao consegui enxergar).

solução!

Oi, Amanda

Desculpe, eu testei só o console.log()

Vc encontrou um problema em se usar o var

O JS passa por um processo chamado "hoisting" durante a fase de compilação/interpretação, no qual ele lê e processa todas as declarações de variáveis e funções antes de executar o código

As variáveis são elevadas (hoisted) para o topo do escopo '{ bloco }' em que foram definidas

O problema é que o var tem escopo global, estão o último valor atribuído é que será usado pela função:

function () {
        tocaSom(idAudio);
    }

Veja este problema. Se trocar o valor de idAudio na última linha do código, é esse valor que será usado.



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

    const tecla = listaDeTeclas[i];
    const instrumento = tecla.classList[1];
    idAudio = `#som_${instrumento}`;
    console.log(idAudio);


    listaDeTeclas[i].onclick = function () {
        tocaSom(idAudio);
    }
}


idAudio = '#som_tecla_tim'
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!