Un cierre se refiere a una función que tiene permiso para acceder a variables en otro alcance de la función, pero el mecanismo de configuración del alcance debe prestarse atención a, es decir, un cierre solo puede obtener el último valor que contiene cualquier variabilidad en la función.
Como en los siguientes casos:
función create () {var arr = new Array (); for (var i = 0; i <10; i ++) {arr [i] = function () {return i;}; } return arr;} var c_arr = create (); for (var i = 0; i <c_arr.length; i ++) {document.write ("c_arr ["+i+"] ="+c_arr [i] ()+"<Br />"); }Resultados de la ejecución:
En la superficie, parece que el valor I devuelto por cada función es diferente, por ejemplo, el valor de c_arr [0] debe ser 0, el valor de c_arr [1] debe ser 1, y así sucesivamente. Cada función se puede obtener devolviendo 10. ¿Por qué?
Debido a que la cadena de alcance de cada función almacena el objeto activo de la función Create (), todos se refieren a la misma variable i. Después de que termina el bucle for, el valor de I se convierte en 10. En este momento, cada función se refiere al mismo objeto variable que contiene la variable i.
Podemos forzar el cierre a comportarse como se esperaba creando otra función de dominio, de modo que cada posición corresponde al valor correspondiente.
función create () {var arr = new Array (); for (var i = 0; i <10; i ++) {arr [i] = function (num) {return function () {return num; };}(i); } return arr;} var c_arr = create (); for (var i = 0; i <c_arr.length; i ++) {document.write ("c_arr ["+i+"] ="+c_arr [i] ()+"<Br />"); }Resultados de la ejecución:
Defina una función anónima y ejecuta la función anónima inmediatamente para asignarla a la matriz. Aquí, la función anónima tiene un número de parámetros, que es el valor que se devolverá por la función final. Al llamar a cada función, pasamos en la variable i. Dado que los parámetros de la función se pasan por valor, el valor actual de la variable I se asignará al parámetro num. Dentro de esta función anónima, se crea y devuelve un número de acceso de cierre, de modo que cada función en la matriz ARR tenga una copia de su propia variable NUM, por lo que puede devolver sus propios valores numéricos diferentes.
Ejemplos clásicos
Veamos un ejemplo clásico. Supongamos que la página tiene un conjunto de etiquetas de botones. Usamos scripts para vincular el evento de clic a este conjunto de etiquetas de botones, y al hacer clic, aparecerá qué etiqueta es esta.
<meta charset = "utf-8"/> <botton> First </boton> <botton> segundo </boton> <botton> tercero </botón> <botón> cuarto </boton> <script type = "text/javaScript"> var obj = document.getElementsByTagName ('Button'); for (var i = 0; i <obj.length; i ++) {obj [i] .mick. function () {alerta (i);}; } </script>Haga clic en cada botón para resultado
En la superficie, parece que hacer clic en cada etiqueta debe aparecer diferentes números
El primero debería aparecer 0;
El segundo debería aparecer 1;
Etcétera.
Pero el resultado es que todos los botones aparecen 4, que obviamente no es el resultado que queremos.
Cambiemos el programa
<meta charset = "utf-8"/> <boton> First </boton> <botton> segundo </boton> <botton> tercero </boton> <botón> cuarto </boton> <script type = "text/javaScript"> var obj = document.getElementsByTagName ('Button'); for (var i = 0; i <obj.length; i ++) {obj [i). function () {alerta (num);}} (i); } </script>Haga clic en el segundo
Haga clic en el cuarto
Solo necesitamos crear una función anónima en la función, que es la misma que los casos anteriores. Se puede implementar una función anónima para capturar la variable externa I, y el valor I de cada botón POP es diferente.