Los cierres en JavaScript son realmente una pregunta cliché. Recientemente, he estado preguntando sobre mis propias habilidades de expresión y no puedo apoyarlas completamente. Estoy loco. En el camino de regreso, de repente pensé en algo muy simple. De hecho, cuando estamos haciendo proyectos, a menudo usamos cierres, pero cuando hacemos preguntas, las respuestas son a menudo las respuestas que a menudo encontramos. Por desgracia, ya sea que estemos tratando con entrevistas o realmente queriendo aprender algo, compartiré con ustedes mi propia comprensión, y escribir es inevitable.
1. ¿Qué es un cierre?
El libro de Red Bao dice: "Se refiere a una función que tiene derecho a acceder a las variables en otro alcance de la función".
En pocas palabras, JavaScript permite el uso de funciones internas, es decir, las definiciones de funciones y las expresiones de funciones se encuentran en el cuerpo de funciones de otra función. Además, estas funciones internas pueden acceder a todas las variables locales, parámetros y otras funciones internas declaradas en la función externa donde residen. Cuando una de estas funciones internas se llama fuera de la función externa que las contiene, se forma un cierre. En términos simples, es "una función crea otra función en el interior, y esta última función puede leer las variables en la función anterior, y la última función puede llamarse un 'cierre'".
2. ¿Cuál es el uso de cierres?
A través de mi extensa revisión, si decimos "mediante el uso de cierres, podemos hacer muchas cosas. Por ejemplo, simulamos el estilo de código orientado a objetos; expresar el código de manera más elegante y concisa; y mejorar la eficiencia de ejecución del código en algunos aspectos", ¿se sentirá vacío? ¿Serán mejores? Dado que no hay un alcance real de nivel de bloque real en JavaScript, sino para declarar algunas variables locales que solo la función puede usar, usaremos cierres, para que podamos reducir en gran medida las variables en el alcance global y purificar el alcance global.
Aquí hay algunos ejemplos:
1. Función anónima de auto-ejecución
Sabemos que si no se agregan todas las variables con la palabra clave VAR, el valor predeterminado se agregará a las propiedades del objeto global. Hay muchas desventajas para agregar tales variables temporales al objeto global.
Por ejemplo: otras funciones pueden usar mal estas variables; Haciendo que el objeto global sea demasiado grande y que afecte la velocidad de acceso (porque el valor de la variable debe atravesarse desde la cadena prototipo).
En cada vez que usamos la variable, usamos la palabra clave var. En situaciones reales, a menudo nos encontramos con una situación en la que algunas funciones solo necesitan ser ejecutadas una vez, y sus variables internas no necesitan mantenerse.
Por ejemplo, en la inicialización de la interfaz de usuario, podemos usar cierres:
var data = {table: [], árbol: {}}; (función (dm) {for (var i = 0; i <dm.table.rows; i ++) {var row = dm.table.rows [i]; for (var j = 0; j <row.cells; i ++) {drawCell (i, j);}}}) (datos);Creamos una función anónima y la ejecutamos de inmediato. Dado que el externo no puede referirse a las variables dentro de él, el recurso se lanzará inmediatamente después de ejecutar la función. La clave no es contaminar el objeto global.
2. Resultado caché
Nos encontraremos con muchas situaciones en el desarrollo. Imagine que tenemos un objeto de función que requiere mucho tiempo que lleva mucho tiempo procesar cada llamada. Luego necesitamos almacenar el valor calculado. Al llamar a esta función, primero buscamos en el caché. Si no se puede encontrar, realizaremos cálculos y luego actualizaremos el caché y devuelva el valor. Si se encuentra, podemos devolver directamente el valor encontrado. Los cierres hacen exactamente esto porque no libera referencias externas, de modo que se puedan preservar los valores dentro de la función.
var cachedsearchbox = (function () {var cache = {}, count = []; return {sectingSearchBox: function (dsid) {if (dsid en cache) {// Si el resultado está en la cache return cache [dsid]; // return el objeto en la cache directamente} var fsB = newit.webctrl.search (dsid); cache [dsid] = fsb; // Actualizar Cache if (count.length> 100) {// Security Cache Size <= 100 Eliminar caché [count.hift ()] CachedSearchBox.attachSearchBox ("Entrada");De esta manera, leeremos el objeto del caché en la segunda llamada.
3. Embalaje
var persona = function () {// El alcance de la variable está dentro de la función, y no se puede acceder al nombre VAR afuera. var name = "predeterminado"; return {getName: functer () {return name; }, setname: function (newName) {name = newName; }}} (); print (persona.name); // Acceso directamente, el resultado es imprime indefinido (persona.getName ()); persona.setName ("Abruzzi"); print (persona.getName ());4. Implementar clases y herencia
function persona () {var name = "predeterminado"; return {getName: functer () {return name; }, setname: function (newName) {name = newName; }}}; var p = nueva persona (); P.SetName ("Tom"); alerta (p.getName ()); var jack = function () {}; // heredado de persona jack.prototype = new Person (); // Agregar método privado jack.prototype.say = function () {alert ("Hola, mi nombre es Jack"); }; var j = nuevo Jack (); J.SetName ("Jack"); J.Say (); alerta (J.GetName ());Al final de la escritura, no sé que al final, todos descubrieran que realmente han usado mucho de esto en los proyectos que ha realizado. De todos modos, lo encontré, y así es como existen los cierres.
Aunque es un cliché, sigue siendo muy importante. En cuanto a los defectos de los cierres, solo diga que si no está abusando de los cierres, conducirá a la fuga de memoria. ¿Cuál es la fuga de memoria en Baidu?^_^.
El breve análisis e interpretación de los cierres en JavaScript (debe leer imprescindible) es todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.