Escopo

Como já sabemos, escopo refere-se à região de um programa onde uma variável ou função é acessível e visível. O escopo determina a vida e a acessibilidade das variáveis e funções em diferentes partes do código.

Tipos de escopo

Escopo de função

O escopo de função, também conhecido como escopo léxico, significa que as variáveis declaradas dentro de uma função só podem ser acessadas dentro dessa função. Essas variáveis são locais para a função, e cada chamada de função cria um novo escopo. Por exemplo:

function exemploFuncao() {
    var variavelLocal = "Eu sou local para esta função.";
    console.log(variavelLocal); // Funciona normalmente
} 

exemploFuncao();
console.log(variavelLocal); // Erro: variavelLocal não está definida

Aqui, variavelLocal é acessível apenas dentro de exemploFuncao. Tentar acessá-la fora dessa função resulta em um erro, pois ela não existe no escopo global ou em outro escopo local.

Escopo de bloco

O escopo de bloco, introduzido no ES6 (2009) com as palavras-chave let e const, restringe o acesso a uma variável ao bloco, instrução ou expressão onde ela é declarada.

Blocos são geralmente definidos por chaves {} em estruturas como loops, condicionais e outros blocos de código:

function exemploBloco() {    
    if (true) {         
        let variavelDeBloco = "Eu sou local para este bloco.";
            console.log(variavelDeBloco); // Funciona normalmente    
        }
        console.log(variavelDeBloco); // Erro: variavelDeBloco não está definida 
} 
exemploBloco();

Comparação

function exemploFuncao() {
    if(true){
        var variavelLocal = "Eu sou local para esta função.";
        console.log(variavelLocal); // Funciona normalmente
    }
    console.log(variavelLocal); // Funciona normalmente
} 

exemploFuncao();
console.log(variavelLocal); // Erro: variavelLocal não está definida
function exemploFuncao() {
    if(true){
        let variavelDeBloco = "Eu sou local para este bloco.";
        console.log(variavelDeBloco); // Funciona normalmente
    }
    console.log(variavelDeBloco); // Erro: variavelLocal não está definida
} 

exemploFuncao();
console.log(variavelDeBloco); // Erro: variavelLocal não está definida