Agora fiquei confuso! Var sendo acessível de fora de uma função?

Toda apostila que li, conteúdo que acessei sempre enfatiza que VAR, quando declarado dentro de uma funcão tem escopo local. Aí me deparei com isso; https://www.dio.me/articles/entendendo-o-escopo-de-variaveis-em-programacao-de-uma-forma-que-voce-nunca-mais-esquecera

Sera que deixei passar algo? Ou será que não entendi alguma particularidade do código que ele postou lá, com VAR dentro da função e sendo acessível fora dela?

Veja se te ajuda: https://pt.stackoverflow.com/q/47165/101.

var pode ter escopo global ou local, mas não de bloco, só o let permite este último. Portanto lendo lá você nunca vai esquecer, porque quando vê o erro de alguém fica mais fácil fixar :)

Geralmente não se recomenda o estado global, embora se souber o que está fazendo, precisa saber muito, pode ser útil. Especialmente não é um grande problema quando se faz algo que JS foi criada originalmente que é um macaquinho dançar e mais nada.

O exemplo ali é local e se ele tivesse feito um exemplo para demonstrar aquilo veria que não funciona o que ele afirmou.

Curioso como as pessoas não sabem mais que teve época que todo mundo falava para uar o varobrigatoriamente, justamente para não dar escopo global por acidente. Depois venho a recomendação de uso do let para não dar escopo sem considerar o bloco. O que muita gente não fala mais que se você usar o let em um navegador antigo seu código não funciona.

Eu falo que a internet é casa do capeta, todo mundo pode postar, até coisas errdas. E isso acontece intensamente. Esse probelma é mais perceptível (para alguns, tem gente que vai ateé aceitar isso), o problema maior é quando o erro é menos perceptível. Mais ainda quando há teimosia. Eu gosto de fazer posts sociológicos. Viou um monte de gente elogiando? Então aprenderam errado, vão treinar o erro, farão errado e vão ensinar errao para outras pessoas.

Mas do que aprender sobre o var, o que de mais importante aprendeu com esse evento?

Enquanto eu escrevia aqui o kht já fazia exemplos mostrando o erro. É fácil aprender quando é algo objetivo, basta fazer experimentos (tem que tomar cuidado com casos que ele pode dar um resultado falso em certas situações, por isso precisa de alguma estudo também, mas este é simples de observar).

Espero ter ajudado. Em geral estou à disposição na plataforma (sem abusos :D)


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

O post está errado. Dá pra verificar com um teste simples (é basicamente o mesmo código que tem lá, só que simplificado):

function f() {
    var infoGlobal = "bla";
}
 
console.log(infoGlobal); // erro!

Esse código dá erro, veja. Mais precisamente, o erro é "ReferenceError: infoGlobal is not defined". Ou seja, a variável não está definida.

"Ah, mas é porque vc não executou a função"

Não, assim também dá o mesmo erro:

function f() {
    var infoGlobal = "bla";
}
 
f();
console.log(infoGlobal); // erro!

Para que a variável esteja no escopo global, na verdade não devemos usar o var (e nem o let ou const):

function f() {
    infoGlobal = "bla";
}
 
f();
// agora funciona
console.log(infoGlobal);

Mas lembre-se que só funciona se a função for chamada. Ou seja, se for assim:

function f() {
    infoGlobal = "bla";
}

// erro!
console.log(infoGlobal);

Dá erro do mesmo jeito. Afinal, a variável só é criada se a função for executada.

Por fim, vale sempre consultar a documentação. Lá deixa bem claro que uma variável declarada com var dentro de uma função é local àquela função.

Esse é o problema da Internet, qualquer um pode escrever qualquer coisa e é difícil separar o joio do trigo. Neste caso eu acho bem grave porque me parece que o cara nem sequer testou o código (se testasse, veria o erro na hora).

foi exatamente o que pensei ("que ele não executou"). Eu até fiz uns testes aqui, só para garantir, mas quiz tirar essa dúvida, pois já é a segunda vez que vejo alguém cometendo esse erro.