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

"IIFE" e porque função no escopo global é um problema?

Olá pessoal,

na aula, o professor alertou sobre um problema no código, que ao ir no console do navegador, ele conseguia acessar o conteúdo da função isso porque estavam em escopo global. Foi introduziu o conceito "IIFE".

Gostaria de uma pitada a mais sobre quando função no escopo global é um problema.

2 respostas
solução!

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!

Oi Leonardo Negrão.

Cara muito obrigado complemento.