¿Qué es un cierre?
Veamos primero un código:
función a () {var n = 0; function inc () {n ++; console.log (n); } Cª(); Cª(); }a(); // salidas de consola 1, luego sale 2Es simple. Veamos otro código:
función a () {var n = 0; this.inc = function () {n ++; console.log (n); };} var c = new a (); C.inc (); // Salida de consola 1C.Inc (); // Salida de la consola 2Es simple.
¿Qué es un cierre? ¡Este es el cierre!
Las funciones que tienen acceso a variables dentro del alcance de otra función son los cierres. Aquí la función INC accede a la variable N en el constructor A, por lo que se forma un cierre.
Veamos otro código:
función a () {var n = 0; function inc () {n ++; console.log (n); } return inc;} var c = a (); c (); // Salida de consola 1C (); // Salida de la consola 2Veamos cómo se ejecuta:
var c = couter (), esta oración couter () devuelve la función inc, entonces esta oración es equivalente a var c = inc;
c (), esta oración es equivalente a Inc (); Tenga en cuenta que el nombre de la función es solo un identificador (un puntero a una función), y () es la función de ejecución.
Las siguientes tres oraciones traducidas a: var c = inc; Cª(); inc ();, ¿hay alguna diferencia entre él y el primer código? No.
¿Qué es un cierre? ¡Este es el cierre!
A todos los tutoriales de libros de texto les gusta usar el último párrafo para ilustrar los cierres, pero creo que esto complica el problema. Lo que se devuelve aquí es el nombre de la función. Los estudiantes que nunca han visto la programación C/C ++ de Tan Haoqiang pueden no reflejar inmediatamente la diferencia entre traer () o no, lo que significa que este método de escritura viene con una trampa. Aunque este método de escritura es más prominente, todavía me gusta singularizar el problema y mirar el Código 1 y el Código 2. Todavía estará confundido sobre el llamado de la función, ¿se confundirá sobre el valor de N?
¿Por qué necesitas escribir así?
Sabemos que cada función de JS es una pequeña habitación negra. Puede obtener información externa, pero el mundo exterior no puede ver directamente el contenido dentro. Poniendo la variable N en una pequeña habitación oscura, excepto la función INC, no hay otra forma de ponerse en contacto con la variable n. Además, definir la variable N con el mismo nombre fuera de la función A no se afecta entre sí. Esta es la llamada mejora de la "encapsulación".
La razón por la que necesita usar la función de retorno para identificar INC es porque la función INC no se puede llamar directamente fuera de la función A, por lo que el return INC está asociado con el exterior. Esto en el Código 2 también solo asocia a Inc con el exterior.
Trampas comunes
Mira esto:
function createFunctions () {var result = new Array (); for (var i = 0; i <10; i ++) {resultado [i] = function () {return i; }; } resultado de retorno;} var funcs = createFunctions (); for (var i = 0; i <funcs.length; i ++) {console.log (funcs [i] ());}A primera vista, pensé que estaba generando 0 ~ 9, pero ¿nunca esperé que saliera 10 10?
La trampa aquí es: ¡la función con () es la función de ejecución! Una oración simple var f = function () {alert ('Hi'); }; no aparecerá, y la siguiente oración f (); ejecutará el código dentro de la función. El código anterior se traduce como:
VAR result = new Array (), i; resultado [0] = function () {return i; }; // La función no se ejecuta, la función permanece sin cambios y la I en la función no se puede reemplazar! resultado [1] = function () {return i; }; // La función no se ejecuta, la función permanece sin cambios y la I en la función no se puede reemplazar! ... resultado [9] = function () {return i; }; // La función no se ejecuta, la función permanece sin cambios y la I en la función no se puede reemplazar! i = 10; funcs = resultado; resultado = null; console.log (i); // funcs [0] () es ejecutar la instrucción Return I, que es devolver 10console.log (i); // funcs [1] () es ejecutar la declaración de retorno I, que es devolver 10 ... console.log (i); // funcs [9] () es ejecutar la declaración de retorno I, que es devolver 10¿Por qué solo los resultados de la recolección de basura pero no yo? Porque todavía estoy siendo referenciado por la función. Es como un restaurante donde los platos siempre son limitados, por lo que el camarero irá a Patrol Taiwán para reciclar platos vacíos, pero ¿cómo se atreve a recoger las placas que todavía contienen verduras? Por supuesto, si vierte manualmente los platos (= nulo) en el plato usted mismo, el plato será llevado. Este es el llamado mecanismo de reciclaje de memoria.
En cuanto a cómo el valor de I todavía puede ser retenido, de hecho, leerlo hasta el comienzo del artículo no debería ser nada de qué preocuparse. ¿No es necesario comer una pieza del plato en el plato para perder una pieza?
Resumimos
Un cierre es una variable que una función se refiere a otra función. Debido a que se hace referencia a la variable, no se reciclará, por lo que se puede usar para encapsular una variable privada. Esta es una ventaja y una desventaja. ¡Los cierres innecesarios solo aumentarán el consumo de memoria! Además, al usar cierres, también debe prestar atención a si el valor de la variable cumple con sus requisitos, ya que es como una variable privada estática. Los cierres generalmente se mezclan con muchas cosas, y solo después de contactarlas con más comprensión, podemos profundizar nuestra comprensión. Aquí solo estamos hablando de cosas básicas.
Enlace a este artículo: http://www.cnblogs.com/qieguo/p/5457040.html
Lo anterior se trata de este artículo, espero que sea útil para el aprendizaje de todos.