Cierre, que es cierre, problema de cierre y análisis
Cierre
Antes de hablar de cierres, primero comprendamos la función
-
Etapa de definición de función
i. Abrir un espacio de almacenamiento en la memoria
ii. Poner el código en el cuerpo de la función como una cadena exactamente igual en este espacio
1. Todas las variables encontradas no se analizan
iii. Asignar esta dirección de espacio a Nombre de función (nombre de variable) -
Fase de llamada de función
i. Encontrar el espacio de almacenamiento correspondiente de acuerdo con el nombre de la función (nombre de la variable)
ii. Reabrir un espacio de ejecución de la función
iii. Realizar la parametrización formal
en este espacio de ejecución iv. Analizar previamente en este espacio de ejecución
v. Almacenar el espacio de almacenamiento de la función Copie el código en el espacio de ejecución y ejecute
vi. Una vez completada la ejecución, el espacio de ejecución abierto se destruye -
Llamada de función
i. Cada llamada de función abrirá un espacio de ejecución
ii. Lo llamas una vez, abre un espacio de ejecución
iii. El código se destruye
iv. Cuando vuelves a llamar, abre un espacio de ejecución nuevamente
v. El código se destruye después de la ejecución
Hablemos de bajo qué circunstancias no se destruirá el espacio de ejecución de la función
-
Un espacio de ejecución de función que no se destruirá
i. Cuando se ejecuta una función, se abrirá un espacio de ejecución
ii. Todos los códigos se ejecutan en este espacio de ejecución
iii. Una vez completada la ejecución, el espacio de ejecución de la función se destruye -
En un caso especial
i. El espacio de ejecución de la función no se destruirá -
¿Cuál es la situación especial?
I. Cuando la función devuelve un "tipo de datos complejos"
ii. Y hay una variable fuera de la función que recibe un "tipo de datos complejos"
iii. En este momento, el espacio de ejecución de la función no se destruirá -
El espacio de ejecución de la función que no se destruirá
i. ¿Cuándo se destruirá?
Ii. Cuando la variable recibida externamente ya no haga referencia al valor de retorno de
la función iii. El espacio de ejecución de la función se destruirá
Cierre
-
Hay tres condiciones necesarias para la generación de cierres (una es indispensable)
1. Una función B se devuelve directa o indirectamente
dentro de la función A 2. Una variable privada de función (datos privados) se usa dentro de la función B 3. Una variable
fuera de la función A Reciba esta función B
para que se forme un espacio funcional que no se destruirá -
Espacio de cierre
1. Llamamos al espacio de ejecución de la función A que no se destruirá como espacio de cierre
2. Llamamos a la función B devuelta en la función A la función de cierre de la función A
3. La definición oficial de la última oración: Cierre ==> función dentro de la función -
Las características de los cierres (las ventajas y desventajas son paralelas)
1. Extender el ciclo de vida de las variables.
Ventajas: Debido a que el espacio de ejecución no se destruye, las variables no se destruyen.
Desventajas: Debido a que el espacio de ejecución no se destruye, siempre existirá en la memoria
2. Puede acceder a la función interna Las
ventajas de las variables privadas : utilizar la función de cierre para acceder a las variables privadas dentro de la función
Desventajas: el espacio de ejecución no se destruirá, siempre existirá en la memoria
3. Proteger las variables privadas (siempre que la función tenga esta característica)
Ventajas: proteger las variables privadas
Desventaja de acceso externo : si desea acceder, debe utilizar la función de cierre -
Las deficiencias de la función de cierre son "fatales"
1. Porque cuando hay algo en un espacio de memoria que no se destruirá,
siempre habrá uso de memoria, si es demasiado, causará desbordamiento de memoria
3. Entonces el resultado es memoria Ceda el paso -
Cuándo usar cierres
1. Cuando necesita extender el ciclo de vida de las variables
2. O cuando necesita acceder a variables privadas dentro de una función determinada
Tema de cierre
function fn(i){
return function(n){
console.log(n + (--i))
}
}
var f = fn(2)
f(3)
fn(4)(5)
fn(6)(7)
f(8)
Análisis: Aquí sigo el método de dibujo para analizar esto es más intuitivo y más fácil de entender:
function fn(i){
return function(n){
console.log(n + (i++))
}
}
var f = fn(10)
f(20)
fn(20)(40)
fn(30)(50)
f(30)