1. El alcance de las variables
Para comprender los cierres, primero debe comprender el alcance variable especial de JavaScript.
Solo hay dos tipos de ámbitos de variables: variables globales y variables locales.
La característica especial del lenguaje JavaScript es que las variables globales se pueden leer directamente dentro de las funciones.
var n = 999; función f1 () {alerta (n); } f1 (); // 999Por otro lado, las variables locales dentro de la función, naturalmente, no se leen fuera de la función.
función f1 () {var n = 999; } alerta (n); // errorHay un lugar para tener en cuenta aquí. Al declarar las variables internamente, debe usar el comando VAR. Si no, ¡en realidad declara una variable global!
función f1 () {n = 999; } f1 (); alerta (n); // 9992. ¿Cómo leer las variables locales desde el exterior?
Por varias razones, a veces necesitamos obtener variables locales dentro de la función. Sin embargo, como se mencionó anteriormente, en circunstancias normales, esto no se puede hacer y solo se puede lograr a través de soluciones.
Eso es definir otra función dentro de la función.
función f1 () {var n = 999; función f2 () {alerta (n); // 999}}En el código anterior, la función F2 se incluye dentro de la función F1, y todas las variables locales dentro de F1 son visibles para F2. Pero al revés no es posible. Las variables locales dentro de F2 son invisibles para F1. Esta es la estructura de "alcance de la cadena" exclusiva del lenguaje JavaScript. Los objetos secundarios buscarán el nivel hacia arriba por nivel para todas las variables de los objetos principales. Por lo tanto, todas las variables del objeto principal son visibles para el objeto infantil, de lo contrario no es cierto.
Dado que F2 puede leer las variables locales en F1, siempre que se use F2 como valor de retorno, ¿no podemos leer sus variables internas fuera de F1?
función f1 () {var n = 999; función f2 () {alerta (n); } return f2; } var de resultado = f1 (); resultado(); // 9993. El concepto de cierre
La función F2 en la sección anterior del código es el cierre.
La definición de "cierre" en varios documentos profesionales es muy abstracta y difícil de entender. Entiendo que un cierre es una función que puede leer variables dentro de otras funciones.
Dado que en el lenguaje JavaScript, solo las subfunciones dentro de las funciones pueden leer variables locales, los cierres pueden entenderse simplemente como "funciones definidas dentro de una función".
Entonces, en esencia, un cierre es un puente que conecta el interior y el exterior de la función.
4. El propósito del cierre
Los cierres se pueden usar en muchos lugares. Tiene dos mayores usos, uno es que las variables dentro de la función se pueden leer como se mencionó anteriormente, y la otra es que los valores de estas variables siempre se mantienen en la memoria.
¿Cómo entender esta oración? Consulte el código a continuación.
función f1 () {var n = 999; nadd = function () {n+= 1} function f2 () {alert (n); } return f2; } var de resultado = f1 (); resultado(); // 999 nadd (); resultado(); // 1000En este código, el resultado es en realidad la función de cierre F2. Se ejecuta dos veces en total, el primer valor es 999 y el segundo valor es 1000. Esto demuestra que la variable local N en la función F1 se ha mantenido en la memoria y no se borra automáticamente después de que se llama a F1.
¿Por qué está sucediendo esto? La razón es que F1 es la función principal de F2, y F2 se asigna a una variable global, que hace que F2 esté siempre en la memoria, y la existencia de F2 depende de F1. Por lo tanto, F1 siempre está en la memoria y no será reciclado por el mecanismo de recolección de basura después de que termine la llamada.
Otro punto notable en este código es que la línea "nadd = function () {n+= 1}" se usa primero antes 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 esta función anónima en sí misma también es un cierre, por lo que NADD es equivalente a un setter, que puede operar en variables locales dentro de la función fuera de la función.
5. Notas sobre el uso de cierres
1) Dado que los cierres causarán que todas las variables en la función se almacenen en la memoria, y el consumo de memoria es muy grande, los cierres no se pueden abusar, de lo contrario causará problemas de rendimiento de la página web y puede conducir a la fuga de memoria en IE. La solución es eliminar todas las variables locales que no se usan antes de salir de la función.
2) El cierre cambiará el valor de la variable dentro de la función principal fuera de la función principal. Por lo tanto, si usa la función principal como objeto, use el cierre como método público y use la variable interna como propiedad privada, tenga cuidado de no cambiar el valor de la variable interna de la función principal a voluntad.