Um fechamento refere -se a uma função que tem permissão para acessar variáveis em outro escopo de função, mas o mecanismo de configuração do escopo precisa receber atenção, ou seja, um fechamento só pode obter o último valor que contém quaisquer variáveis na função.
Como nos seguintes casos:
função create () {var arr = new Array (); for (var i = 0; i <10; i ++) {arr [i] = function () {return i;}; } return arr;} var c_arr = create (); para (var i = 0; i <c_arr.length; i ++) {document.write ("c_arr ["+i+"] ="+c_arr [i] ()+"<r />"); }Resultados da execução:
Na superfície, parece que o valor i retornado por cada função é diferente, por exemplo, o valor de c_arr [0] deve ser 0, o valor de c_arr [1] deve ser 1 e assim por diante. Cada função pode ser obtida retornando 10. Por quê?
Como a cadeia de escopo de cada função armazena o objeto ativo da função create (), todos eles se referem à mesma variável i. Após o final do loop for, o valor de I se torna 10. Nesse momento, cada função refere -se ao mesmo objeto variável que mantém a variável i.
Podemos forçar o fechamento a se comportar conforme o esperado, criando outra função de domínio, para que cada posição corresponda ao valor correspondente.
função create () {var arr = new Array (); for (var i = 0; i <10; i ++) {arr [i] = function (num) {return function () {return num; };}(eu); } return arr;} var c_arr = create (); para (var i = 0; i <c_arr.length; i ++) {document.write ("c_arr ["+i+"] ="+c_arr [i] ()+"<r />"); }Resultados da execução:
Defina uma função anônima e executa a função anônima imediatamente para atribuí -la à matriz. Aqui, a função anônima possui um Num de parâmetro, que é o valor a ser retornado pela função final. Ao chamar cada função, passamos na variável i. Como os parâmetros da função são passados pelo valor, o valor atual da variável será atribuído ao parâmetro num. Dentro desta função anônima, um NUM de acesso ao fechamento é criado e retornado, para que cada função na matriz ARR tenha uma cópia de sua própria variável NUM, para que possa retornar seus próprios valores numéricos diferentes.
Exemplos clássicos
Vejamos um exemplo clássico. Suponha que a página tenha um conjunto de tags de botão. Usamos scripts para vincular o evento de clique a este conjunto de tags de botão e, ao clicar, ele aparecerá qual tag é essa.
<meta charset = "utf-8"/> <button> primeiro </button> <butão> segundo </button> <butão> terceiro </button> <butto> quarto </button> <script type = "text/javascript"> var obj = document.getElementsByTagname ('Button); para (var i = 0; function () {alert (i);}; } </script>Clique em cada botão para resultar
Na superfície, parece que clicar em cada rótulo deve aparecer números diferentes
O primeiro deve aparecer 0;
O segundo deve aparecer 1;
E assim por diante.
Mas o resultado é que todos os botões aparecem 4, o que obviamente não é o resultado que queremos.
Vamos mudar o programa
<meta charset = "utf-8"/> <button> primeiro </button> <butão> segundo </button> <butão> terceiro </button> <butto> quarto </button> <script type = "text/javascript"> var obj = document.getElementsByTagname ('Button); para (var i = 0; function (num) {return function () {alert (num);}} (i); } </script>Clique no segundo
Clique no quarto
Precisamos apenas criar uma função anônima na função, que é a mesma dos casos acima. Uma função anônima pode ser implementada para capturar a variável externa i, e o valor i de cada pop de botão é diferente.