1. O escopo das variáveis
Para entender o fechamento, você deve primeiro entender o escopo variável especial do JavaScript.
Existem apenas dois tipos de escopos de variáveis: variáveis globais e variáveis locais.
O recurso especial da linguagem JavaScript é que as variáveis globais podem ser lidas diretamente nas funções.
var n = 999; função f1 () {alert (n); } f1 (); // 999Por outro lado, as variáveis locais dentro da função naturalmente não são lidas fora da função.
função f1 () {var n = 999; } alerta (n); // erroHá um lugar para se notar aqui. Ao declarar variáveis internamente, você deve usar o comando var. Caso contrário, você realmente declara uma variável global!
função f1 () {n = 999; } f1 (); alerta (n); // 9992. Como ler variáveis locais de fora?
Por vários motivos, às vezes precisamos obter variáveis locais dentro da função. No entanto, como mencionado anteriormente, em circunstâncias normais, isso não pode ser feito e só pode ser alcançado por meio de soluções alternativas.
Isso é para definir outra função dentro da função.
função f1 () {var n = 999; função f2 () {alert (n); // 999}}No código acima, a função F2 está incluída na função interna F1 e todas as variáveis locais dentro de F1 são visíveis para F2. Mas o contrário não é possível. As variáveis locais dentro de F2 são invisíveis para F1. Esta é a estrutura do "escopo da cadeia" exclusivo da linguagem JavaScript. Os objetos infantis procurarão o nível para cima por nível para todas as variáveis de objetos pais. Portanto, todas as variáveis do objeto pai são visíveis para o objeto filho, caso contrário, não é verdadeiro.
Como F2 pode ler variáveis locais em F1, desde que F2 seja usado como valor de retorno, não podemos ler suas variáveis internas fora da F1?
função f1 () {var n = 999; função f2 () {alert (n); } retornar f2; } var resultado = f1 (); resultado(); // 9993. O conceito de fechamento
A função F2 na seção anterior do código é o fechamento.
A definição de "fechamento" em vários documentos profissionais é muito abstrata e difícil de entender. Meu entendimento é que um fechamento é uma função que pode ler variáveis dentro de outras funções.
Como no idioma JavaScript, apenas as subfunções internas podem ler variáveis locais, os fechamentos podem ser simplesmente entendidos como "funções definidas dentro de uma função".
Assim, em essência, um fechamento é uma ponte que conecta o interior e o exterior da função.
4. O objetivo do fechamento
Os fechamentos podem ser usados em muitos lugares. Ele tem dois maiores usos, um é que as variáveis dentro da função podem ser lidas como mencionadas acima, e a outra é que os valores dessas variáveis são sempre mantidos na memória.
Como entender esta frase? Por favor, veja o código abaixo.
função f1 () {var n = 999; nadd = function () {n+= 1} função f2 () {alert (n); } retornar f2; } var resultado = f1 (); resultado(); // 999 nadd (); resultado(); // 1000Neste código, o resultado é na verdade a função F2 de fechamento. Ele é executado duas vezes no total, o primeiro valor é 999 e o segundo valor é 1000. Isso prova que a variável local n na função F1 foi mantida na memória e não é automaticamente limpa após a chamada F1.
Por que isso está acontecendo? O motivo é que a F1 é a função pai de F2 e F2 é atribuída a uma variável global, o que faz com que F2 esteja sempre na memória, e a existência de F2 depende de F1. Portanto, a F1 está sempre na memória e não será reciclada pelo mecanismo de coleta de lixo após o término da chamada.
Outro ponto notável neste código é que a linha "nadd = function () {n+= 1}" é usada pela primeira vez antes do NADD, então o NADD é uma variável global, não uma variável local. Em segundo lugar, o valor do NADD é uma função anônima, e essa função anônima em si também é um fechamento, portanto, o NADD é equivalente a um setter, que pode operar em variáveis locais dentro da função fora da função.
5. Notas sobre o uso de fechamentos
1) Como o fechamento fará com que todas as variáveis da função sejam armazenadas na memória e o consumo de memória é muito grande, os fechamentos não podem ser abusados, caso contrário, causará problemas de desempenho da página da Web e poderá levar ao vazamento de memória no IE. A solução é excluir todas as variáveis locais que não são usadas antes de sair da função.
2) O fechamento alterará o valor da variável dentro da função pai fora da função pai. Portanto, se você usar a função pai como objeto, use o fechamento como método público e use a variável interna como sua propriedade privada, tome cuidado para não alterar o valor da variável interna da função pai à vontade.