Cierres que han sido confusos durante mucho tiempo.

1. ¿Qué es un cierre?

MDN :

Una función está agrupada con referencias a su estado circundante ( entorno léxico, entorno léxico ) (o la función está rodeada de referencias), tal combinación es un cierre ( cierre ). Es decir, los cierres le permiten acceder al alcance de una función externa desde dentro de una función interna. En JavaScript, cada vez que se crea una función, se crea un cierre al mismo tiempo que se crea la función.

    let a = "奥特曼"
    function fn() {
      console.log(a); //奥特曼
    }

Desde MDN, puedes entender que lo anterior es un cierre y el concepto de las siguientes tres líneas es un significado  

1. Función + referencia del estado circundante (ambiental) = cierre

2. La suma de "función" y "variables accesibles dentro de la función" (también llamada entorno) es un cierre.

3. La función de ejecución se compone de f+a y el resultado es un cierre

A través de estos tres mismos conceptos, también tengo un concepto más nuevo de cierres.   

Lo que entendí antes es que una función que tiene acceso a otro ámbito se llama cierre. Por supuesto, esta oración no es muy diferente de los tres entendimientos anteriores, pero siempre pensé que era una forma de anidamiento de funciones.

    function fn() {
      var a = "奥特曼"
      return function () {
        console.log(a)
      }
    }
    let a = fn()
    a()

Malentendido ①

Es cierto que lo anterior es un cierre, pero no es seguro que solo el anidamiento se llame cierre. El anidamiento es solo en la mayoría de los casos. Tampoco puedo escribir retorno y no recibir el valor de la función fn. Simplemente no es llamado por mí, pero sigue siendo una estructura de cierre. Así que tenga esto en cuenta, escribir devolución es solo para recibirlo, y no afecta que sea un cierre. Del mismo modo, también puedo montar esta función en la ventana y también puedo acceder a los datos

    function fn() {
      var a = "奥特曼"
       function fn2() {
        console.log(a)
      }
      window.test=fn2
    }
    fn()  
    window.test()

Malentendido ②

Cierre de herramientas de depuración

No sé si tienes esta duda. Antes de aprender, encontrarás que los cierres generarán un Closure durante la depuración del punto de interrupción. ¿No es un cierre si no encuentras el cierre después de la depuración? De hecho, no puedes entiéndalo así, al igual que diez años Closure puede no aparecer en el Chrome anterior, claro, no sé si aparecerá o no, pero cuando aparece un Closure en la depuración de breakpoint, debe aparecer cuando se llama a una función o devuelto.

2. El papel del cierre

Cerrar datos, proporcionar operación

El mecanismo de operación de la función es llamar = "destruir", que no se puede llamar fuera de la función, y la técnica de usar el cierre puede operar en variables fuera

El alcance de las variables en JavaScript no es más que el dominio de la variable global y las variables locales. Cuando se usan variables, se puede acceder a las variables de alcance fuera de la función dentro de la función, pero no se puede acceder a las variables de alcance dentro de la función fuera de la función.

① Lea las variables de alcance externo dentro de la función (por supuesto, esto también es un cierre)

    let a = "奥特曼"
    function fn() {
      console.log(a); //奥特曼
    }
    fn() 

② El osciloscopio externo lee las variables internas de la función

    function fn() {
      let a= "奥特曼"
    }
    console.log(a);  //a is not defined

Si no comprende el alcance, primero mire   el alcance global y el alcance local

Del código anterior, se puede ver que las variables dentro de la función no se pueden obtener desde el exterior, por lo que se usa el cierre en este momento

 El cierre le permite acceder al alcance de la función externa en una función interna. Para dividir esta oración en código, la subfunción accede a las variables en el alcance de la función principal para formar un cierre. 

    function fn() {
      var a = "奥特曼"
      function fn2() {
        console.log(a);
      }
      fn2()
    }
    fn()

Después de ver el ejemplo anterior, veamos la siguiente característica

     function outerFn() {
      var i = 0;
      i++
      console.log(i);
    }
    outerFn() //1 
    outerFn() //1
    outerFn() //1

La función está constantemente creando y destruyendo creación y destrucción.


    function outerFn() {
      var i = 0;

      function innerFn() {
        i++;
        console.log(i);
      }
      return innerFn;
    }
    var inner = outerFn(); 
    inner();  //1
    inner();  //2
    inner();  //3
    var inner2 = outerFn();
    inner2(); //4
    inner2(); //5
    inner2(); //6

característica

Los cierres permiten que estas variables existan siempre en la memoria y no se destruirán cuando se destruya la función

Cada vez que se ejecuta una función externa, se abrirá un espacio de memoria, la dirección de la función externa es diferente y se recreará una nueva dirección.

Con respecto a la pérdida de memoria:

La fuga de memoria se refiere a la memoria a la que ya no se puede acceder y aún ocupa el espacio de la memoria. Los datos que usamos para acceder al cierre no son el cierre que causa la fuga de memoria.

Sobre por qué se usan los cierres:

También puede usar cierres para leer variables en el alcance de las funciones.

¡Los cierres están en todas partes! Cuando usa funciones para introducir variables de entorno externo, ya ha usado cierres, ¡pero no se dio cuenta! ¡El punto clave de esta frase! !

Supongo que te gusta

Origin blog.csdn.net/m0_46846526/article/details/118157618#comments_26522669
Recomendado
Clasificación