Primeiro, a seguir estão três códigos que explicam o escopo
// =========== Exemplo 1 ============== var scope = 'global'; function fn () {alert (escopo); var scope = 'local'; alerta (escopo);} fn (); // resultado de saída? alerta (escopo); // resultado de saída? // ============ Exemplo 2 ============ var scope = 'global'; function fn () {alert (escopo); escopo = 'local'; alerta (escopo);} fn (); // resultado de saída? alerta (escopo); // resultado de saída? // ============ Exemplo 3 =========== var scope = 'global'; function fn (escopo) {alert (escopo); escopo = 'local'; alerta (escopo);} fn (); // resultado de saída? alerta (escopo); // resultado de saída?Esses três códigos têm apenas uma pequena diferença, mas os resultados são completamente diferentes. Exemplo 1 Saídas [Undefinido, Local, Global], Exemplo 2 Saídas [Global, Local, Local], Exemplo 3 Saídas [indefinido, local, global]. Se você não pode responder corretamente, isso significa que ainda não entendeu as características do escopo do JavaScript.
O que é escopo?
Alguém pode perguntar: qual é o escopo da variável A? Perguntei novamente mais tarde: qual é o escopo da função A? Quais são os escopos de variáveis e funções?
Vamos primeiro olhar o que significa "escopo". Quando "escopo" é quebrado, significa "função" e "domínio"
O escopo é a faixa acessível de variáveis e funções, ou a área em que variáveis ou funções funcionam.
1.Scope of JavaScript Função:
A área dentro da função é o escopo da função, e ambas as variáveis e funções podem acessar operações nessa área. A área fora da função mais externa é chamada de escopo global, e a área dentro da função é chamada de escopo local.
2. Escopo de variáveis JavaScript:
Na região em que a variável está localizada no código -fonte, o escopo dessa variável é e a variável pode ser acessada e operada nessa área. As variáveis definidas no escopo global são chamadas de variáveis globais, e as variáveis definidas na função são chamadas de variáveis locais.
Para simplesmente entender, o código -fonte do JS é dividido em áreas de bloco por função {}. Se essas áreas mudarem de identidade, elas são o escopo de uma certa função ou de uma determinada variável. O escopo de uma variável e o escopo de uma função podem se referir à mesma área no código -fonte.
Cadeia de escopo
A cadeia de escopo é um mecanismo de pesquisa variável e de função no JavaScript. Determina o escopo das variáveis e funções, ou seja, escopo. Entenda o princípio da cadeia de escopo e você pode entender os três exemplos no artigo anterior, para que você possa saber o motivo e o motivo.
A cadeia de escopo é um conceito na documentação do ECMAScript-262. O mecanismo JavaScript é implementado de acordo com a documentação do ECMAScript-262. Compreender o princípio de trabalho do mecanismo JavaScript é propício ao nosso entendimento das características do JavaScript, mas a maioria dos programadores JS não entenderá as tecnologias muito subjacentes. Portanto, ao ler a documentação do ECMAScript-262, podemos ter uma maneira intuitiva de simular o princípio de trabalho do mecanismo JavaScript.
Este artigo explicará o princípio de formar cadeias de escopo através da terceira edição do ECMAScript-262-3 em 1999 e introduzirá vários conceitos, como ambiente de execução, objetos variáveis e objetos ativos, objetos de argumentos, cadeias de escopo, etc. Em 2009, foi divulgada a quinta edição do ecmascript-262-5. A diferença foi que os conceitos como objetos variáveis e objetos ativos foram cancelados, e novos conceitos, como ambientes lexicais e registros ambientais, foram introduzidos, portanto, não confunda os conceitos das duas versões.
1. Contextos de execução
Os contextos de execução também são traduzidos em contexto de execução. Quando o analisador entra no código executável do ECMAScript, o analisador entra em um ambiente de execução. O ambiente de execução ativo forma uma pilha lógica. O ambiente de execução na parte superior dessa pilha lógica é o ambiente de execução em execução atual.
NOTA: Existem três tipos de código executável no ECMAScript, Global, Function and Eval. O ambiente global é o código executável global e as funções são o código executável da função. A pilha lógica é um formato especial de armazenamento de dados, caracterizado por 'Primeiro dentro e fora, e depois dentro e fora'. A adição de dados será primeiro empurrada para a parte superior da pilha lógica e a exclusão de dados deve ser excluída da parte superior.
Objeto variável, objeto ativo e objeto de argumentos
Cada ambiente de execução possui um objeto variável associado a ele. Quando o analisador entra no ambiente de execução, será criado um objeto variável, que mantém referências a variáveis e funções declaradas no ambiente atual de execução.
Objeto variável é um conceito abstrato. Em diferentes ambientes de execução, objetos variáveis têm identidades diferentes. Antes de o analisador entrar em qualquer ambiente de execução, um objeto global é criado. Quando o analisador entra no ambiente de execução global, o objeto global atua como um objeto variável. Quando o analisador entra em uma função, um objeto ativo será criado como um objeto variável.
2. Dois estágios quando o analisador processa o código
Todos sabemos que o analisador JavaScript analisa o código um por um, é um tapete? Isso envolve dois estágios quando o analisador processa o código, analisando o código e executando o código.
Quando o analisador entra no ambiente de execução, o objeto variável adicionará variáveis e funções declaradas no ambiente de execução como suas propriedades, o que significa que as variáveis e funções estão disponíveis antes da declaração e o valor variável é indefinido. Esta é a razão para a promoção de variáveis e declarações de função (iça). Ao mesmo tempo, a corrente do escopo e isso são determinados. Esse processo é o estágio de análise, comumente conhecido como pré-parto. Em seguida, o analisador começa a executar o código, adiciona uma referência ao valor correspondente à variável e obtém o resultado da execução. Este processo é o estágio de execução.
Vamos citar duas deliciosas castanhas:
var a = 123; var b = "abc"; função c () {alert ('11 ');}Após a análise e execução do código no ambiente global acima, o objeto global será usado como um objeto variável e os seguintes dados serão salvos.
função testfn (a) {var b = "123"; função c () {alert ("abc"); }} testfn (10);Quando o analisador entra no ambiente de execução da função, um objeto ativo será criado como um objeto variável. O objeto ativo também criará um objeto de argumentos. O objeto de argumentos é um parâmetro definido para salvar parâmetros. É por isso que podemos usar argumentos [0] e assim por diante ao escrever funções.
3. Cadeia de escopo
Cada ambiente de execução tem uma cadeia de escopo associada a ele. É definido quando o analisador entra no ambiente de execução. A cadeia de escopo é uma lista de objetos usada para recuperar variáveis e funções em cada objeto variável. Isso garante que o ambiente de execução tenha o direito de acessar quais variáveis e funções. Por exemplo, é uma castanha.
var a = '123'; função testfn (b) {var c = 'abc'; função testfn2 () {var d = 'efg'; alerta (a); } testfn2 ();} testfn (10);A variável A não é declarada no TESTFN2. Por que o testfn2 pode chamar a variável global A? Como todo o processo aconteceu? Por favor, veja a foto abaixo.
Quando o analisador entra no ambiente de execução global, variáveis e funções são encontradas apenas no objeto global ao chamá -las.
Quando o analisador entra no ambiente de execução da função TESTFN, a propriedade interna da função [[escopo]] é preenchida primeiro no objeto global e, em seguida, o objeto ativo do TESTFN é adicionado ao objeto global para formar uma cadeia de escopo.
Quando o analisador entra no ambiente de execução da função TESTFN2, a propriedade interna da função [[escopo]] é preenchida primeiro na cadeia de escopo dos pais e, em seguida, o objeto ativo TESTFN2 atual é adicionado à extremidade frontal da cadeia de escopo para formar uma nova corrente de escopo.
Quando o Testfn2 chama a variável A, primeiro pesquise no objeto ativo Testfn2 atual. Se não for encontrado, siga a corrente do escopo para cima. Se não for encontrado, procure a corrente de escopo. Se não for encontrado, procure a corrente de escopo até que seja encontrada no último objeto global, caso contrário, um erro será relatado. Portanto, as variáveis do ambiente externo podem ser chamadas dentro da função e as variáveis do ambiente externo não podem ser chamadas dentro da função. Este é o princípio das características do escopo.