Cómo entender los cierres en js
1 Alcance de la variable
Para comprender los cierres, primero debe comprender la variable especial de JavaScript. alcance.
No existen más de dos tipos de ámbitos de variables: variables globales y variables locales.
Lo especial de JavaScript es que puedes leer variables globales dentro de una función, pero no puedes leer variables locales fuera de la función.
Nota: Al declarar variables dentro de una función, debes usar el comando var. De lo contrario, ¡en realidad estás declarando una variable global!
2. ¿Cómo leer variables locales dentro de una función desde fuera?
Por diversas razones, a veces necesitamos leer variables locales dentro de una función. Sin embargo, como se mencionó anteriormente, en circunstancias normales, ¡no podemos hacer esto! Esto sólo se puede lograr mediante soluciones alternativas.
En otras palabras, define otra función dentro de la función.
función f1(){
var n=999;
función f2(){alert(n); // 999}
} En el código anterior, la función f2 está contenida en f1 y todas las variables locales en f1 son visibles para f2. Pero lo contrario no es cierto: las variables locales en f2 no son visibles para f1.
Esta es la estructura de alcance de cadena única de Javascript.
En esta estructura, el objeto secundario buscará todas las variables del objeto principal. Por lo tanto, todas las variables del objeto padre son visibles para el objeto hijo y viceversa.
Dado que f2 puede leer variables locales en f1, ¿no podemos leer variables internas distintas de f1 usando f2 como valor de retorno?
3. El concepto de cierre
La función f2 en el código anterior es un cierre.
La definición de cierre en diversas publicaciones profesionales es muy abstracta. Mi entendimiento es: un cierre es una función que puede leer las variables internas de otras funciones.
Debido a que en JavaScript, solo las subfunciones dentro de la función pueden leer variables locales, los cierres pueden entenderse simplemente como "funciones definidas dentro de la función".
Entonces, en esencia, los cierres son el puente entre el interior y el exterior de una función.
4. Usos de los cierres
Los cierres se pueden utilizar en muchos lugares. Dos de los usos más importantes son la capacidad mencionada anteriormente de leer variables dentro de funciones, y otro uso es mantener los valores de estas variables en la memoria en todo momento y no borrarlos automáticamente después de llamar a f1.
¿Por qué sucede esto? La razón es que f1 es la función principal de f2, y f2 está asignado a una variable global, lo que hace que f2 esté siempre en la memoria, y la existencia de f2 depende de f1, por lo que f1 siempre está en la memoria y no se eliminará. al final de la llamada Mecanismo de recolección de basura (recolección de basura) reciclaje.
Otra cosa que vale la pena destacar en este código es la línea "nAdd=function(){n+=1}". Primero, no hay una palabra clave var delante de nAdd, por lo que nAdd es una variable global, no una variable local. En segundo lugar, el valor de nAdd es una función anónima, y la función anónima en sí es un cierre, por lo que nAdd es equivalente a un definidor, que le permite operar variables locales dentro de la función desde fuera de la función.
5. Precauciones al usar cierres
(1) Dado que los cierres almacenarán las variables de la función en la memoria, el consumo de memoria es muy grande, por lo que no se puede abusar de los cierres. el rendimiento de la página web se reducirá y pueden producirse pérdidas de memoria en IE. La solución es eliminar todas las variables locales no utilizadas antes de salir de la función.
(2) El cierre se ubicará fuera de la función principal y cambiará el valor de la variable dentro de la función principal.
Entonces, si usa una función principal como objeto, un cierre como método público y una variable interna como valor privado, tenga cuidado de no cambiar el valor de la variable dentro de la función principal.
Artículos relacionados: