Olá, Davilson! Tudo bem?
Nós não temos muito controle sobre o escopo global, até porque, esse escopo é uma camada de responsabilidade do navegador (ou qualquer outro programa, que chamamos de runtime) que roda nosso código.
Por isso, existem alguns motivos que podem te prejudicar ao usá-lo.
O primeiro, que o instrutor cita, é o fato de que variáveis globais são atribuídas ao objeto global (Window
no caso dos navegadores), e portanto são acessíveis por esse objeto.
Se você for no seu console do navegador e rodar console.log(window)
você verá a estrutura do objeto, inclusive com funções que nós usamos sempre (como fetch
e setTimeout
). Da mesma forma que temos acesso a essas funções que usamos sempre, o cliente terá acesso a sua função, se ela estiver disponível no escopo global.
O problema disso é que você perde o controle das suas regras. Se o usuário quiser efetuar algum processo que está disponível globalmente, ele pode, e dependendo do processo, isso não deveria ser permitido.
Outro problema é que o objeto Window
contém muitas propriedades, e não são apenas funções da API do navegador, e outras propriedades da DOM, é possível encontrar os elementos HTML que possuem id
. E aí você pode encontrar outro problema: conflito de nomes. Teoricamente, é um caso raro, mas se acontecer, é muito difícil de encontrar o problema, pois foi um conflito de responsabilidade.
Por isso, o ideal é sempre separarmos esses contextos. O contexto global é gerenciado pelo navegador, e podemos acessá-lo apenas para leitura de dados e execução de funções. Quando quisermos criar algum dado (seja variável ou função), fazemos isso dentro de um escopo próprio, em que tanto evitamos conflitos entre o que nós criamos e o que navegador criou, como protegemos esses dados dentro de um contexto que temos total controle.
Também usamos let
e const
para criar variáveis hoje em dia pelo mesmo motivo. Qualquer variável declarada com var
acaba sendo criada no escopo global, e independente do local em que ela é criada no nosso código, a memória para a criação dela é alocada antes, o que de novo pode gerar vários conflitos. Já let
e const
não têm esses comportamentos.
Certo? Qualquer dúvida estou à disposição, bons estudos!