O escopo é sempre a principal prioridade em qualquer linguagem de programação, pois controla a visibilidade e o ciclo de vida de variáveis e parâmetros. Falando nisso, primeiro entenda dois conceitos: escopo do nível de bloco e escopo de funções.
O que é um escopo em nível de bloco?
A instrução definida em qualquer par de aparelhos encaracolados ({e}) pertence a um bloco, e todas as variáveis definidas são invisíveis fora do bloco de código, que chamamos de escopo no nível do bloco.
O escopo da função é fácil de entender (*^__^*), e os parâmetros e variáveis definidos na função são invisíveis fora da função.
A maioria dos idiomas da classe C possui escopos de nível em bloco, mas o JS não. Por favor, veja a demonstração abaixo:
// canguation#inclua <stdio.h> void main () {int i = 2; eu--; if (i) {int j = 3; } printf ("%d/n", j); }Ao executar esse código, um erro de "use uma variável indefinida: j" aparecerá. Como você pode ver, a linguagem C tem um escopo de nível de bloco porque J é definido no bloco de declaração de IF, por isso é inacessível fora do bloco.
E como o JS se apresenta, vejamos outra demonstração:
functin test () {for (var i = 0; i <3; i ++) {} alert (i); } teste();Execute este código e o "3" aparece. Pode -se observar que fora do bloco, a variável que eu defini no bloco ainda está acessível. Ou seja, o JS não suporta escopos de nível de bloco, ele suporta apenas escopos de função e as variáveis definidas em qualquer lugar de uma função são visíveis em qualquer lugar nessa função.
Então, como fazemos com que o JS tenha um escopo de nível de bloco? Você ainda se lembra que, quando a variável definida em uma função é chamada, a variável será destruída? Podemos usar esse recurso para simular o escopo do nível de bloco de JS? Veja a seguinte demonstração:
function test () {(function () {for (var i = 0; i <4; i ++) {}}) (); alerta (i); } teste();Execute -o novamente neste momento, um erro indefinido de "eu" aparecerá. Haha, ele é implementado ~~~ aqui, colocamos o bloco de declaração para um fechamento e chamamos essa função. Quando a chamada de função é concluída, a variável será destruída automaticamente, para que não possamos acessá -la fora do bloco.
O recurso de fechamento do JS é o recurso mais importante ((*^__^*) todo mundo entende). No JS, para evitar conflitos de nomeação, devemos tentar evitar o uso de variáveis globais e funções globais. Então, como evitá -lo? Ok, como mostrado na demonstração acima, podemos colocar tudo o que queremos definir em um
(function () {// content}) ();Entre eles, neste momento, é equivalente a adicionar um escopo de função à sua camada externa? Programas fora deste escopo não podem acessá -los.