JavaScript: ¿Qué es un cierre?

Inserte la descripción de la imagen aquí

Resumen de Wikipedia:
  en informática, los cierres (inglés: cierre), también conocidos como cierres léxicos o cierres de funciones, son funciones que se refieren a variables libres. La variable libre referenciada existirá con esta función, incluso si ha dejado el entorno donde se creó. Por lo tanto, hay otra forma de decir que los cierres son entidades compuestas de funciones y sus entornos de referencia asociados. Los cierres pueden tener múltiples instancias en tiempo de ejecución, y diferentes entornos de referencia y la misma combinación de funciones pueden producir diferentes instancias.
  
Resumen: La Enciclopedia Baidu
  es una función que puede leer las variables internas de otras funciones. Por ejemplo, en JavaScript, solo las subfunciones dentro de las funciones pueden leer variables locales, por lo que los cierres pueden entenderse como "funciones definidas dentro de una función". En esencia, un cierre es un puente que conecta el interior de una función y el exterior de una función.

1. Definición: una solución al problema, una estructura especial, un mecanismo.

  1. Contiene dos niveles de significado para ejecutar el bloque de código (el objeto de su propia máquina tiene una referencia de objeto) y el alcance de las variables libres.
  2. Cuando una función interna anidada hace referencia a una variable o función de una función externa, se genera un cierre

Segundo, el rol: solo puede hacer que la variable se reutilice y proteger la variable de la contaminación

  1. Use la variable dentro de la función y después de que la función se ejecute, todavía vive en la memoria (extendió el ciclo de vida de la variable local)
  2. Hacer que la función sea operable externamente (lectura y escritura) a los datos dentro de la función (variable / función)

3. Cómo usar cierres:

  1. En la etapa de precompilación, la declaración de variables relevantes de GO, cada función de capa externa y función de capa interna AO es clara
  2. Aclare la relación entre la función de capa externa y la función de capa interna:
    ① ajuste la función de capa interna de las variables buscadas y protegidas y las variables de operación con la función de capa
    externa ; ② la función de capa externa asigna la función de capa interna a la función de capa externa a través de algunos métodos, como Valor de retorno;
    ③ Llame a la función de capa externa para obtener la función de capa interna.
  3. La secuencia de ejecución se ejecuta de arriba a abajo en el lenguaje interpretado.Al ejecutar una instrucción de llamada de función, se genera un nuevo elemento en la pila del entorno de ejecución, es decir, un nuevo entorno de ejecución registra una nueva llamada mágica y se crea su correspondiente objeto de alcance de función (AO) .
  4. Aclare la relación entre la función interna y la función externa AO. La herencia de la relación depende de si la función secundaria (función interna) existe y el alcance apunta a la función primaria (función externa).

4. Ciclo de vida del cierre:

Generado
  Cuando se ejecuta la definición de la función interna anidada, se produce la
muerte ( llamada no interna)
  Cuando la función interna anidada se convierte en un objeto basura,
f = nulo Después de
  ejecutar la función, las variables locales declaradas dentro de la función generalmente no existen , Solo pueden existir variables que existen en el cierre
  (es decir, un puntero a una variable global también apunta a la dirección de una función interna)

5. Desventajas: pérdida de espacio, que causa un desbordamiento de memoria.

Desbordamiento de memoria: se produce un error cuando se ejecuta un programa. Cuando la memoria requerida por el programa excede la memoria restante, se produce un error de desbordamiento de memoria.
Pérdida de memoria: la memoria ocupada no se libera a tiempo y es fácil acumular más pérdidas de memoria. Causa desbordamiento de memoria. Los
cierres son fáciles de causar desbordamiento de memoria. La razón es que después de que se ejecuta la función, las variables locales en la función no se liberan, lo que hace que la función de alcance de la función de capa interna se libere a la función externa ( cadena de alcance ), lo que resulta en el final de la llamada a la función externa pero AO no se puede liberar, lo que finalmente resulta en un tiempo de ocupación de memoria más largo.
  
Solución:

  1. Reducir el uso de cierres;
  2. Liberación a tiempo (f = null ==> hacer funciones internas objetos basura ==> reciclar cierres)

6. Ejemplos

		var nAdd;
		function out(){
			var n = 999;
			nAdd = function(){ 
				n ++;
			}
			return function(){
				console.log(n);
			}
		}
		// out AO{
		 	n: 999 
		 }
		var getN = out();
		getN();		// n = 999
		// nAdd AO{	
		// }
		nAdd();		// 执行n++ 外层函数声明的n 即 999+1
		getN();		// n = 1000

Siete, aplique el módulo JS

Todos los datos y funciones están encapsulados en una función (privada), y solo un objeto o función que contiene n métodos está expuesto al exterior. El usuario del módulo solo necesita llamar al método a través del objeto expuesto por el módulo para lograr el correspondiente Función de

Publicado 40 artículos originales · elogiado 31 · visitas 2784

Supongo que te gusta

Origin blog.csdn.net/CodingmanNAN/article/details/103349995
Recomendado
Clasificación