Cada byte de um programa JavaScript é executado neste ou naquele contexto de execução. Você pode pensar nesses contextos como vizinhos de código, que podem indicar cada linha de código: de onde vem e que são amigos e vizinhos. Sim, esta é uma informação muito importante, porque a sociedade JavaScript possui regras bastante rigorosas que estipulam quem pode interagir com quem. O contexto operacional é uma comunidade com portões em vez de uma pequena porta que está aberta dentro dela.
Normalmente, podemos nos referir a esses limites sociais como escopos e ter uma importância suficiente para legislar na Carta de cada vizinho, que é a cadeia de escopo do contexto sobre a qual queremos falar. Dentro de uma relação de bairro específica, o código só pode acessar variáveis em sua cadeia de escopo. Comparado a variáveis além de sua vizinhança, o código prefere lidar com local (local, ou seja, local).
Qualquer linguagem de programação tem o conceito de escopo. Simplificando, o escopo é o escopo acessível de variáveis e funções, ou seja, o escopo controla a visibilidade e o ciclo de vida de variáveis e funções. O escopo do JavaScript sempre foi um ponto de conhecimento difícil de entender no desenvolvimento do front-end. Lembre -se de algumas palavras para resolver facilmente o escopo do JavaScript.
1. "Sem escopo no nível de bloco em JavaScript"
Há um escopo de nível de bloco em Java ou C#, ou seja, os aparelhos também são um escopo.
public static void main () {if (1 == 1) {string name = "sete"; } System.out.println (nome);} // Relate um erro public static void main () {if (1 == 1) {string name = "sete"; } Console.WriteLine (nome);} // Relate um erroSem escopo no nível de bloco em JavaScript
function main () {if (1 == 1) {var name = 'sete'; } console.log (nome);} // saída: sete2. JavaScript adota o escopo da função
No JavaScript, cada função atua como um escopo e as variáveis no escopo interno não podem ser acessadas externamente.
function main () {var inervalue = 'sete';} main (); console.log (inervalue); // ERRO: Referência não capturada: InnerValue não está definida3. Cadeia de escopo JavaScript
Como cada função no JavaScript é um escopo, se uma função aninhada aparecer, uma cadeia de escopo aparecerá.
XO = 'Alex'; function func () {var xo = "sete"; função interna () {var XO = 'alvin'; console.log (XO); } interno ();} func ();Por exemplo, o código acima aparece na cadeia de escopo composta por três escopos. Se a corrente do escopo aparecer, o pedido aparecerá ao procurar variáveis. Para o exemplo acima:
Quando o Console.log (XO) é executado, sua ordem de pesquisa é pesquisar根据作用域链从内到外. Se a camada interna não existir, ela gradualmente procurará até que nenhuma exceção seja encontrada.
4. A cadeia de escopo de JavaScript foi criada antes da execução
O escopo do JavaScript foi criado antes de ser executado. Quando é executado no futuro, você só precisa pesquisar de acordo com a cadeia do escopo.
Exemplo 1:
XO = 'Alex'; function func () {var xo = "sete"; função interna () {console.log (xo); } retornar interno;} var ret = func (); ret (); // resultado de saída: seteO código acima já existe antes que a função seja chamada:
Escopo global -> Escopo de função Func -> Escopo de função interna
Ao executar [ret ();], uma vez que se refere à função interna, a cadeia de escopo dessa função foi definida como: escopo global -> Escopo da função func -> Escopo de função interna; portanto, ao executar [ret ();], as variáveis serão encontradas com base na cadeia de escopo existente.
Exemplo 2:
XO = 'Alex'; função func () {var xo = "eirc"; função interna () {console.log (xo); } xo = 'sete'; retornar interno;} var ret = func (); ret (); // resultado de saída: seteO código acima tem o mesmo objetivo que o Exemplo 1 e também enfatiza que a cadeia de escopo já existe antes que a função seja chamada:
Escopo global -> Escopo de função Func -> Escopo de função interna
Diferentemente, ao executar [var ret = func ();], o valor da variável XO no escopo do func foi redefinido para "sete" de "Eric", então, ao executar [ret ();] mais tarde, você só pode encontrar "sete".
Exemplo 3:
xo = 'Alex'; barra de função () {console.log (xo);} função func () {var xo = "sete"; barra de retorno;} var ret = func (); ret (); // resultado de saída: AlexNo código acima, duas cadeias de escopo foram criadas antes que a função seja executada:
Escopo global -> escopo da função de barra
Escopo global -> Escopo de função Func
Ao executar [ret ();], o retiro refere -se à função da barra e a cadeia de escopo da função da barra já existe: escopo global -> escopo da função de barra; portanto, ao executar, ela será pesquisada com base na cadeia de escopo existente.
5. declaração antecipada
Se você não criar variáveis e usá -las diretamente no JavaScript, será relatado um erro:
console.log (xxoo); // Erro: Uncathed ReferenceError: XXOO não está definido
Em JavaScript, se um valor for criado sem atribuir um valor, o valor será indefinido, como:
var xxoo; console.log (xxoo); // saída: indefinido na função se escrito assim: function foo () {console.log (xo); var XO = 'sete';} foo (); // saída: indefinidoO código acima não relata um erro, mas produz a indefinição. O motivo é que, antes que as funções JavaScript sejam executadas, elas declararão todas as variáveis nelas sem atribuir valores. Portanto, é equivalente ao exemplo acima que a função já executou VAR XO quando "pré -compilado"; Portanto, a saída do código acima é indefinida.
JS é uma linguagem muito interessante. Como muitos de seus recursos são direcionados para a operação de DOM em HTML, parece casual e um pouco menos rigoroso. No entanto, com a prosperidade e o desenvolvimento contínuos do front-end e a ascensão do nó, o JS não é mais uma "linguagem de brinquedos" ou uma "extensão CSS" na era do jQuery. O mencionado neste artigo é fácil de ser confundido ou incompreendido para iniciantes e desenvolvedores de JS que passaram pelo desenvolvimento da web tradicional. Espero que este artigo possa ser útil.