Hoje, um pequeno estagiário da empresa me perguntou a diferença entre dois códigos JS:
Código 1:
<script type = "text/javascript"> var a = "hello"; function test () {var a; alerta (a); a = "mundo"; alerta (a); } </script>Código 2:
<script type = "text/javascript"> var a = "hello"; function test () {alert (a); a = "mundo"; alerta (a); } </script>Eu acho que é tão simples. Não é apenas um problema de escopo entre variáveis globais e variáveis locais? Eu eu disse: "Quando a variável global for duplicada com a variável local, o escopo da variável local substituirá o escopo da variável global. Depois de deixar o escopo da variável local, ela retornará ao escopo da variável global. Então, os resultados dos dois códigos em execução são: 1) HEREFINEND 2) Hello.
<Cript> var a = 1; function test () {alert (a); var a = 2; alerta (a); } teste(); alerta (a); </script>Qual é o resultado igual? É a saída 1 2 1? Bem, pensei que sim antes de enviar o caso de teste para ela, mas após a produção de teste ... o resultado da corrida era indefinido 2 1. Naquela época, fiquei intrigado e perguntei ao professor Gu que percebi que não sabia muito sobre JS, então trabalhei duro para aprender + teste e resumi o seguinte:
1. O escopo das variáveis JavaScript é dividido de acordo com os blocos de método (ou seja, é dividido por um par de aparelhos {} da função). Lembre -se, é um bloco de funções e, enquanto, e se os blocos não forem os critérios de divisão de escopo. Você pode dar uma olhada nos seguintes exemplos:
<Cript> function test2 () {alert ("antes para o escopo:"+i); // Eu não recebe um valor (não declarado! Use variáveis ou funções não declaradas para lançar um erro fatal e interromper a execução do script) // Neste momento, o valor de i está subfinado para (var i = 0; i <3; i ++) {alert ("em para escopo:"+i); // i é 0, 1, 2 e quando eu tenho 3 anos, o loop é saltado} alerta ("depois para o escopo:"+i); // i é 3, observe que ele já está fora do escopo, mas eu ainda é retido como 3 enquanto (verdadeiro) {var j = 1; quebrar; } alerta (j); // j é 1, observe que ele já está ativado enquanto estiver fora do escopo, o valor de j permanece em 1 se (true) {var k = 1; } alerta (k); // O valor de k é 1. Observe que ele já está fora do escopo, mas o valor de k permanece em 1} test2 (); // se (escopo da função externa) a saída das variáveis i, j e k que existem apenas no teste2 terão um efeito mágico? alerta (i); //erro! É isso mesmo, é um erro, porque a variável I não é declarada (não não atribuída, distinguindo a saída da primeira linha da função Test2), resultando em um erro de script e o programa termina aqui! alerta ("Esta impressão de linha ainda será lançada?"); // não executado alerta (j); // não executado alerta (k); // não executado </sCript>2. Antes da execução, o JavaScript conduzirá uma análise completa da parte da declaração de todo o arquivo de script (incluindo variáveis locais) para determinar o escopo das variáveis reais. Como entender? Veja o seguinte exemplo:
<Cript> var a = 1; function test () {alert (a); // a é indefinido! Essa A não é uma variável global, porque uma variável local duplicada foi declarada no escopo da função (a quarta última linha do corpo da função) e // a variável global A é substituída, o que mostra que o JavaScript conduzirá uma análise completa da parte da definição de todo o arquivo de script antes da execução. Portanto, antes que o teste da função () seja executado, // a variável A no corpo da função é apontada para a variável local interna em vez da variável global externa. Mas, neste momento, A é declarado apenas e não atribuiu um valor, por isso gera indefinido. a = 4 alerta (a); // a é 4, não há suspense? O A aqui ainda é uma variável local! var a; // A variável local A declara alerta (a); // a ainda tem 4, porque 4 foi atribuído a um teste antes} (); alerta (a); // a é 1, que não está no escopo da função, o valor de A é o valor da variável global </sCript>3. Quando a variável global é duplicada com a variável local, o escopo da variável local substituirá o escopo da variável global. Depois de deixar o escopo da variável local, ele retorna ao escopo da variável global. Quando a variável global encontra uma variável local, como usar a variável global? Use window.globalvariablename.
<Cript> var a = 1; function test () {alert (window.a); // A é 1, aqui é uma variável global! var a = 2; // A variável local a é definida neste alerta de linha (a); // A é 2, e aqui está uma variável local! } teste(); alerta (a); // a é 1, não está no escopo da função, o valor de A é o valor da variável global </sCript>Obviamente, para mais artigos, consulte os artigos relacionados abaixo.