As palavras anteriores
Na maioria das vezes, a principal razão pela qual estamos confusos sobre o escopo é que não podemos distinguir se as pesquisas variáveis devem ser executadas nas posições de ordem de função aninhadas ou na ordem das chamadas de função. Juntamente com a interferência desse mecanismo, a pesquisa variável é muito propensa a erros. Na verdade, isso é causado por dois modelos de trabalho de escopo. O escopo é dividido em escopo lexical e escopo dinâmico. Ao distinguir esses dois modelos de escopo, você pode ter um entendimento claro do processo de pesquisa variável. Este artigo é o segundo capítulo da série JavaScript Scope - LEXICAL SCOPE e SCOPE DINHIATÍVEL
Escopo lexical
Conforme mencionado no primeiro artigo, o primeiro estágio de trabalho do compilador é chamado Word particípio, que decompõe uma sequência composta por caracteres em unidades lexicais. Este conceito é a base para entender o escopo lexical
Simplificando, o escopo lexical define o escopo no estágio lexical, que é determinado por onde as variáveis e o escopo do bloco são escritos ao escrever o código. Portanto, o escopo permanece inalterado quando o analisador lexical processa o código.
relação
Não importa onde a função seja chamada e, não importa como ela seja chamada, seu escopo lexical é determinado apenas pela posição em que a função é declarada.
função foo (a) {var b = a * 2; barra de função (c) {console.log (a, b, c);} bar (b * 3);} foo (2); // 2 4 12Neste exemplo, existem três escopos aninhados. Para ajudar a entender, pense neles como várias bolhas incluídas passo a passo
As bolhas do escopo são determinadas por onde o código do bloco de escopo correspondente é gravado e são incluídas passo a passo.
Bubble 1 contém todo o escopo global, com apenas um identificador: foo
Bubble 2 contém o escopo criado por Foo, que tem três identificadores: A, Bar e B
Bubble 3 contém o escopo criado por barra, com apenas um identificador: c
Encontrar
A estrutura das bolhas com escopo e seus relacionamentos posicionais fornecem ao motor informações de posição suficientes, que o mecanismo usa para encontrar a localização do identificador.
No trecho de código, o motor executa o console.log (...) Declaração e procura referências às três variáveis A, B e C. Começa pela primeira vez com o escopo mais interno, ou seja, o escopo da barra (...). O motor não pode encontrar um aqui, por isso irá para o nível anterior para continuar pesquisando no escopo do foo aninhado (...). A é encontrado aqui, então o motor usa essa referência. O mesmo vale para b. E para C, o motor o encontrou em bar (...)
[Nota] A pesquisa de escopo lexical procurará apenas identificadores de primeiro nível. Se o código faz referência a foo.bar.baz, a pesquisa de escopo lexical só tentará encontrar identificadores Foo. Depois de encontrar essa variável, as regras de acesso ao atributo de objeto assumem o acesso aos atributos Bar e Baz, respectivamente
foo = {bar: {baz: 1}}; console.log (foo.bar.baz); // 1Cobrir
A pesquisa em escopo começa no escopo mais interno em que o tempo de execução está localizado e prossegue passo a passo para fora ou para cima até que o primeiro identificador correspondente seja atendido.
Os identificadores com o mesmo nome podem ser definidos em escopos aninhados de várias camadas, que é chamado de "efeito de oclusão". Os identificadores internos "oclutam" identificadores externos
var a = 0; function test () {var a = 1; console.log (a); // 1} test ();As variáveis globais são atributos automaticamente dos objetos globais, para que possam ser acessados diretamente por referência aos atributos dos objetos globais, em vez de passar diretamente pelo nome lexical do objeto global.
var a = 0; function test () {var a = 1; console.log (window.a); // 0} test ();Essa técnica permite o acesso a variáveis globais obscurecidas por variáveis de mesmo nome. Mas se as variáveis não globais estiverem bloqueadas, elas não poderão ser acessadas, não importa o quê.
Escopo dinâmico
O JavaScript usa o escopo lexical, e sua característica mais importante é que seu processo de definição ocorre durante o estágio de escrita do código.
Então, por que apresentar o escopo dinâmico? De fato, o escopo dinâmico é outro mecanismo importante de JavaScript para o primo. A maior parte da confusão do escopo é porque o escopo lexical e esse mecanismo estão confusos, então não posso dizer a diferença entre estupidamente
Escopos dinâmicos não se importam com a forma como as funções e escopos são declarados e declarados em qualquer lugar, apenas de onde são chamados. Em outras palavras, as cadeias de escopo são baseadas na pilha de chamadas, não no ninho de escopo no código
var a = 2; function foo () {console.log (a);} barra de função () {var a = 3; foo ();} bar ();[1] Se estiver no escopo lexical, é o ambiente JavaScript atual. A variável A é pesquisada pela primeira vez na função Foo (), mas não é encontrada. Portanto, siga a cadeia de escopo para pesquisar no escopo global, encontre e atribua um valor de 2. Portanto, o console sai 2
【2】 Se estiver em escopo dinâmico, da mesma forma, a variável A é pesquisada pela primeira vez em Foo () e não encontrada. Aqui, você seguirá a pilha de chamadas para pesquisar no local onde a função Foo () é chamada, ou seja, a função da barra (), encontre e atribua o valor a 3. Portanto, o console sai 3
Resumo: a diferença entre os dois escopos. Em suma, o escopo lexical é determinado no horário da definição, enquanto o escopo dinâmico é determinado em tempo de execução.
O exposto acima é a segunda parte do escopo lexical e do escopo dinâmico introduzido pelo editor. Espero que seja útil para você. Se você quiser saber mais, preste atenção ao wulin.com!