Fechamento JS
O que saber antes do fechamento
1. Escopo de função
(1). A característica especial da linguagem JS é que as variáveis globais podem ser lidas diretamente nas funções internas
A cópia do código é a seguinte:
<script type = "text/javascript">
var n = 100;
função parent () {
alerta (n);
}
pai (); // 100
</script>
Se em php
A cópia do código é a seguinte:
<? php
$ n = 100;
função parent () {
eco $ n;
}
pai (); // o erro será relatado n não é definido
?>
(2). Variáveis locais dentro da função não podem ser lidas fora da função
A cópia do código é a seguinte:
<script type = "text/javascript">
função parent () {
var m = 50;
}
pai ();
alerta (m); // o erro m não está definido
</script>
Observe que, ao declarar variáveis internamente, você deve adicionar VAR, caso contrário, uma variável global será declarada.
A cópia do código é a seguinte:
função parent () {
M = 50;
}
pai ();
alerta (m); // 50
// Claro que isso é ainda mais no PHP.
A cópia do código é a seguinte:
<? php
função parent () {
Global $ m; // global, definição e atribuição devem ser separados
$ m = 50;
}
pai ();
eco $ m; // 50
?>
// Se não houver global, não haverá erros de definição
Às vezes, se você precisar obter variáveis locais dentro da função, precisará usar as características do escopo das variáveis JS. Por exemplo, definir funções infantis dentro da função, para funções infantis, a função pai é sua global e a função filho pode acessar as variáveis na função pai (para todo o código JS, é uma variável local)
A cópia do código é a seguinte:
<script type = "text/javascript">
função parent () {
var m = 50;
function filho () {
alerta (m);
}
filho de volta;
}
var s = pai (); // salvar o resultado globalmente
s (); // 50
</script>
Todas as variáveis locais dentro dos pais são visíveis para as funções filhos, mas as variáveis locais dentro de suas funções filho são invisíveis para as funções dos pais. Esta é a estrutura do escopo da cadeia exclusiva do JS. O objeto infantil procurará o nível de variáveis de todos os objetos pais por nível. Todas as variáveis do objeto pai são visíveis para os objetos filhos, caso contrário, ele não é verdadeiro! A função do filho acima é um fechamento
Alguns alunos podem fazer isso
A cópia do código é a seguinte:
função parent () {
var m = 50;
function filho () {
alerta (m);
}
}
pai ();
filho () // O filho da função não está definido
Observe que, no JavaScript, as funções declaradas na função são locais e são liberadas após a execução da função.
Preste atenção à diferença entre isso e PHP
A cópia do código é a seguinte:
<? php
função parent () {
function filho () {
$ m = 50;
eco $ m;
}
}
pai ();
filho (); // a saída 50 não relatará um erro
?>
Encerramento
Funções definidas internamente funções, pontes conectando funções internas e externas
Existem 2 funções de fechamento:
Primeiro, a função de leitura dentro das variáveis acima mencionadas,
O segundo é salvar os valores dessas variáveis na memória para realizar o compartilhamento de dados
Aqui estão alguns exemplos de fechamentos
A cópia do código é a seguinte:
<script type = "text/javascript">
var cnt = (function () {
var i = 0;
Return function () {
alerta (i);
i ++;
}
}) ();
cnt (); // 0
cnt (); // 1
cnt (); // 2
cnt (); // 3
</script>
Eu salvo o resultado da execução da função anônima (ou seja, atribuindo a declaração da subcunção ao corte da variável global) na memória
Ao executar o corte (), o valor é recuperado diretamente da memória. Somente a função cnt () pode ser chamada e não é possível alertar diretamente (i)
Você também pode transferir parâmetros para o fechamento
A cópia do código é a seguinte:
var cnt = (function (num) {
Return function () {
alerta (num);
num ++;
}
}) (5);
cnt (); // 5
cnt (); // 6
cnt (); // 7
// Claro, você também pode passar os parâmetros ao ligar
var cnt = (function () {
var i = 0;
Retornar função (num) {
num+= i;
alerta (num);
i ++;
}
}) ();
cnt (1); // 1
cnt (2); // 3
cnt (3); // 5
Para ter uma melhor compreensão dos fechamentos, analisamos o seguinte código
Por exemplo, quero retornar uma matriz com 5 funções na matriz, a primeira função aparece 0, e a segunda aparece 1 ...
Se o código for escrito assim
A cópia do código é a seguinte:
caixa de função () {
var arr = [];
para (i = 0; i <5; i ++) {
arr = function () {return i;}
}
retornar arr;
}
var a = box ();
alerta (a); // matriz contendo cinco corpos de função
alerta (a [0] ());
alerta (a [1] ());
O corpo da função pop-up
function () {return i;}}
Finalmente, este é 4 e depois ++ se torna 5
Para paradas de loop
Verificou -se que todos apareceram 5, o que obviamente não atendeu aos nossos requisitos
Solução 1
Autoexecução de funções dentro
A cópia do código é a seguinte:
caixa de função () {
var arr = [];
para (i = 0; i <5; i ++) {
arr = (function (num) {return i;}) (i);
}
retornar arr;
}
var a = box ();
for (var i = 0; i <A.Length; i ++) {
alerta (a);
}
Mas descobrimos que os elementos da matriz retornada são o resultado da execução da função, mas o que queremos é que a função precisa ser atualizada.
Solução 2
Implementação de fechamento
A cópia do código é a seguinte:
caixa de função () {
var arr = [];
for (var i = 0; i <5; i ++) {
arr = (function (num) {
retornar function () {return num;}
})(eu);
}
retornar arr;
}
var arr = box ();
for (var i = 0; i <5; i ++) {
alerta (arr ()); // 0,1,2,3,4
}
Código -chave
A cópia do código é a seguinte:
arr = (function (num) {
retornar function () {return num;}
})(eu);
Quando eu = 0
arr [0] = (function (num) {return function () {return num;}}) (0);
1 hora
arr [1] = (function (num) {return function () {return num;}}) (1);
Os acima são os benefícios dos fechamentos! Muito simples e prático.