“Escopo” refere-se ao contexto atual de execução no qual seu código pode referenciar ou “ver” valores e expressões. Variáveis, objetos e funções de várias partes do código são acessíveis com base em seus escopos.
Em JavaScript, variáveis, objetos e funções podem ter um escopo global, um escopo de módulo, um escopo de bloco ou um escopo de função.
Escopo Global em JavaScript
Qualquer valor declarado fora de uma função ou bloco em um script tem um escopo global e qualquer outro arquivo de script em seu programa pode acessá-lo.
Por exemplo, declarando uma variável global em um arquivo:
// index.js
deixe variável global = "algum valor"
Significa que qualquer outro script em seu programa pode acessá-lo:
// otherScript.js
console.log (variável global) // algum valor
Declarando variáveis JavaScript no escopo global é uma prática ruim porque pode levar à poluição do namespace. O namespace global é o espaço superior do Javascript que contém as variáveis, objetos e funções. Em um navegador, ele se conecta ao Janela objeto, enquanto o NodeJS usa um objeto chamado global.
Poluir o namespace global pode levar à colisão de nomes. Esta é uma situação em que seu código tenta usar o mesmo nome de variável para coisas diferentes no mesmo namespace. As colisões de nomes são frequentemente encontradas em grandes projetos que usam várias bibliotecas de terceiros.
Escopo do Módulo
Um módulo é um arquivo autônomo que encapsula e exporta pedaços de código para outros módulos em um projeto usarem. Ele permite que você organize e mantenha sua base de código com mais eficiência.
Módulos ES formalizados o padrão do módulo JavaScript em JavaScript em 2015.
As variáveis que você declara em um módulo têm o escopo definido para esse módulo, o que significa que nenhuma outra parte do programa pode acessá-las.
Você só pode usar uma variável declarada em um módulo fora dele se o módulo exportar essa variável usando o exportar palavra-chave. Você pode então importar esse nome para outro módulo usando o importar palavra-chave.
Aqui está um exemplo que mostra a exportação de uma classe:
// index.js
exportarclasseFoo{
construtor(propriedade_1, propriedade_2) {
isto.propriedade_1 = propriedade_1
isto.propriedade_2 = propriedade_2
}
}
E aqui está como você pode importar esse módulo e usar a propriedade que ele exporta:
// someModule.js
importar {Foo} a partir de './index.js'barra const = new Foo('foo', 'bar')
console.log (bar.propriedade_1) // foo
Os arquivos não são declarados como módulos por padrão em JavaScript.
No JavaScript do lado do cliente, você pode declarar um script como um módulo definindo o modelo atribuir a módulo no roteiro marcação:
<tipo de script ="módulo" src="index.js"></script>
No NodeJS, você pode declarar um script como um módulo definindo o modelo propriedade para módulo na tua pacote.json Arquivo:
{
"modelo": "módulo"
}
Escopo do Bloco
Um bloco em JavaScript é onde um par de chaves começa e termina.
Variáveis declaradas dentro de um bloco com o deixar, e const palavras-chave têm o escopo desse bloco, o que significa que você não pode acessá-las fora dele. Este escopo não se aplica a variáveis declaradas usando o var palavra-chave:
{ //Início do bloco
const um = '1'
deixe dois = '2'
var três = '3'
} // Fim do blococonsole.log (um) // lança erro
console.log (três) // "3"
As variáveis incluídas no bloco acima e declaradas como const ou let são acessíveis apenas dentro do bloco. No entanto, você pode acessar a variável declarada usando o var palavra-chave fora do bloco.
Escopo da Função
As variáveis declaradas dentro de uma função são comumente chamadas de variáveis locais e têm o escopo da função. Você não pode acessá-los fora da função. Este escopo se aplica a variáveis declaradas com o var, deixar, e const palavras-chave.
Como as variáveis declaradas em uma função são locais para a função, os nomes das variáveis podem ser reutilizados. A reutilização de nomes de variáveis com escopo de função é conhecida como sombreamento de variável, e a variável externa é chamada de “sombreada”.
Por exemplo:
funçãomultiplicar() {
deixar um = 1
var dois = 2
const três = 3Retorna um dois três
}
// Sombreamento variável
const três = 'três' // Não dá erro
Uma compreensão das regras de escopo é vital
Ter uma compreensão dos escopos disponíveis em JavaScript torna mais fácil evitar erros. Tentar acessar uma variável que não está disponível em um escopo específico é uma fonte abundante de bugs.
Uma compreensão do escopo também envolve conceitos como poluição de namespace global, que pode tornar seu código mais propenso a bugs.