Olá Luiz.
No inicio quando tudo era feito com var
e function
, não existiam conceitos como class
e module
e o código js ficava "solto" dentro do arquivo, usava o IIFE para organizar o código e inicializar objetos sem que isso gerasse conflito com outras funções e variáveis. Em resumo criava um escopo para um conjunto de funções e variáveis. Hoje existem outras formas de contornar isso como trabalhar com class
, modules
, const
e let
.
Fiz um exemplo aqui https://onecompiler.com/javascript/3zs7qk79n para tentar exemplificar.
Você pergunta se é correto usar IIFE. Depende para o que vc está usando. Se for para organizar o código, talvez seja melhor trabalhar com modules
e usar import
e export
(https://www.w3schools.com/js/js_modules.asp). A não ser que esteja tentando manter compatibilidade com navegadores muito antigos como o IE.
Block Statement cria um escopo para um bloco. IIFE declara e executa imediatamente uma função. O efeito é semelhante, mas o objetivo é diferente.
O problema de funções e variáveis globais é realmente o conflito. Se vc declara uma var nome
em um arquivo js e em outro arquivo também declara var nome
a segunda vai sobreescrever a primeira. A mesma coisa para funções.