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

Por que funciona se não há referencia?

Pessoal, na linha 4 é passado uma variável "erro" no foreach. Por que funciona se ela não vem de lugar nenhum? Não foi criada nem passada por parâmetro.

function showErrorsMessages(erros){
  var ul = document.querySelector("mensagens-erro");
  ul.innerHTML = "";

  erros.foreach(function(erro)){
    var li = document.createElement("li");
    li.textContent= erro;
    ul.appendChild(li);
  }
}
6 respostas
solução!

Oi Marcos, tudo bem ?

Quem vai passar essa variavel é o próprio navegador quando houver algum erro, por isso o código está funcionando.

Não entendi muito bem a explicação. Quando substituo erro por erros o código continua funcionando normalmente. Alguém poderia explicar melhor isso?

function exibeMensagemDeErro (erros) {
    var ul = document.querySelector ("#mensagens-erro");
    ul.innerHTML = "";    

    erros.forEach (function(erros) {
        var li  = document.createElement ("li");
        li.textContent = erros;
        ul.appendChild (li);
    });

}

curioso que há também outras variáveis que podem ser passadas pelo "ambiente/navegador"

Boa noite, pessoal.

Leopoldo, seu código continua funcionando por que quando você cria uma variável em um escopo mais específico com o mesmo nome de uma variável de um escopo mais amplo, a referência da segunda se perde e é substituída pela da primeira. Ou seja, naquele escopo, a variável "erros" agora referencia, em cada iteração, um objeto dentro do array (* no escopo superior o valor não se altera).

Pode parecer um pouco confuso, então tente rodar este código aqui, por exemplo:

var valores = [1, 2, 3];

valores.forEach(function(valor) {
    var valores = 10;
    console.log(valores);
});

console.log(valores);

Nesse caso o valor 10 será printado enquanto dentro do loop. Fora dele, no entanto, o array inteiro será printado.

A confusão no seu código se dá ao fato de a variável que você está usando para receber o valor de cada elemento nas iterações do loop tem o mesmo nome do array no escopo superior. Entretanto, para o JavaScript, o nome da variável não é importante e, por isso, ele simplesmente substitui a referência dentro daquele escopo.

OBS: Em JavaScript, se não me engano, cada função tem seu próprio escopo.

Espero ter ajudado. Um abraço!

Interessante essa explicação. Então não há sobre-escrita do que está "fora" da função ao que está "dentro". Mas e como fica o uso interno na função de "variável global?" Ex:

var global = 1;
function func (){
    var teste = global;
return teste; 
}

O retorno seria 1?

Boa noite, Marcos.

Sim, dentro da função existe um novo escopo. No entanto, já que não existe a variável 'global' dentro deste novo escopo, o interpretador do JavaScript então procura a referência no escopo superior, encontrando então o valor '1', como mencionado.

Tente neste mesmo exemplo que você deu, adicionar dentro da função a seguinte linha:

var global = 10;

Logo em seguida você pode printar ou realizar qualquer alteração na variável 'global'. O valor da variável de fora não poderá mais ser alterado dentro dessa função.

Mas pode haver sobrescrita sim! Se você não criar uma referência local ("var global") dentro da função a referência de fora será usada e pode ser alterada sim.

var global = 1;

function func () {

    global = 5;

    teste = global;

    console.log(global);
}

func();
console.log(global);

Este código retorna " 5 5 ", por exemplo.

Enquanto que este outro retorna " 5 1 ":

var global = 1;

function func () {

    var global = 5;

    teste = global;

    console.log(global);
}

func();
console.log(global);

EDIT: É interessante mencionar também o chamado "Hoist". É um mecanismo em JavaScript que faz com que as declarações de variáveis sejam 'movidas' para o todo da fila de execução dentro de um determinado escopo. Em outras palavras, mesmo se você usar a variável 'global' dentro da função antes de declarar a variável 'global' como variável local (neste escopo) a mesma será tratada como uma variável local por que o JavaScript 'puxa' a declaração para o início da fila de execução, antes dela ser usada.

Um código como este abaixo, por exemplo, não altera o valor da variável do escopo superior e os valores " 5 1 " serão printados.

var global = 1;

function func () {

    global = 10;

    var global = 5;

    console.log(global);
}

func();
console.log(global);