Closures de JavaScript
- Página anterior Enlazado de funciones JS
- Página siguiente Introducción a las clases JS
Las variables JavaScript pertenecen alocal
oglobal
ámbito.
las variables globales pueden acceder aClosure
implementan locales (privadas).
variables globales
la función puede acceder a las variablesfuncióndefinidas internamente, como:
Ejemplo
function myFunction() { var a = 4; return a * a; }
pero la función también puede acceder a las variablesexternoVariables definidas, como:
Ejemplo
var a = 4; function myFunction() { return a * a; }
En el último ejemplo,a
esglobalVariable.
En la página web, las variables globales pertenecen al objeto window.
Las variables globales pueden ser usadas y modificadas por todos los scripts en la página (y en la ventana).
En el primer ejemplo,a
eslocalVariable.
Las variables locales solo pueden usarse dentro de la función en la que se definen. Para otros scripts y funciones es invisible.
las variables globales y locales con el mismo nombre son variables diferentes. Modificar una no cambia la otra.
sinpalabra clave var
Las variables creadas siempre son globales, incluso si se crean en una función.
Vida de las variables
Las variables globales viven tanto como su aplicación (ventana, página web).
Las variables locales no viven mucho tiempo. Se crean en la llamada a la función y se eliminan después de que la función se completa.
Un dilema de contador
Supongamos que desea usar una variable para contar y desea que este contador esté disponible para todas las funciones.
Puede usar variables globales y funciones para incrementar el contador:
Ejemplo
// Inicializar el contador var counter = 0; // Función para incrementar el contador function add() { counter += 1; } // Llamar tres veces a add() add(); add(); add(); // Ahora debería ser 3
Este enfoque tiene un problema: cualquier código en la página puede cambiar el contador sin llamar a add().
Para la función add(), el contador debería ser local para evitar que otro código lo cambie:
Ejemplo
// Inicializar el contador var counter = 0; // Función para incrementar el contador function add() { var counter = 0; counter += 1; } // Llamar tres veces a add() add(); add(); add(); // Ahora debería ser 3. Pero es 0.
No es útil porque mostramos el contador global en lugar del contador local.
Al hacer que la función regrese a sí misma, podemos eliminar el contador global y acceder al contador local:
Ejemplo
// Función para incrementar el contador function add() { var counter = 0; counter += 1; return counter; } // Llamar tres veces a add() add(); add(); add(); // Ahora debería ser 3. Pero es 1.
No es útil porque cada vez que llamamos a una función, reseteamos el contador local.
Las funciones internas de JavaScript pueden resolver este problema.
Funciones anidadas de JavaScript
Todas las funciones tienen derecho a acceder al ámbito global.
De hecho, en JavaScript, todas las funciones tienen derecho a acceder a su ámbito superior.
JavaScript admite funciones anidadas. Las funciones anidadas pueden acceder a su ámbito superior.
En este ejemplo, la función interna plus()
puede acceder a la función superior de counter
Variable de cuenta:
Ejemplo
function add() { var counter = 0; function plus() {counter += 1;} plus(); return counter; }
De esta manera podemos resolver el problema del contador, si podemos acceder desde afuera plus()
Función.
También necesitamos encontrar una función que se ejecute solo una vez counter = 0
Método.
Necesitamos un closure (cerrado).
Closures de JavaScript
¿Recuerdas la función autoinvocada? ¿Qué hace esta función?
Ejemplo
var add = (function () { var counter = 0; return function () {return counter += 1;} })(); add(); add(); add(); // El contador actual es 3
Ejemplo de explicación
Variable add
La asignación es el valor de retorno de la función autoinvocada.
Esta función autoinvocada solo se ejecuta una vez. Establece el contador en cero (0) y devuelve la expresión de la función.
De esta manera, add se convierte en una función. Lo más "excelente" es que puede acceder al contador del ámbito padre.
Esto se llama JavaScript Closure. Esto permite que la función tenga "PrivadoLa variable se vuelve posible.
El contador está protegido por el ámbito de esta función anónima y solo se puede modificar usando la función add.
Un closure es una función que tiene acceso al ámbito del padre, incluso después de que el padre ha cerrado.
- Página anterior Enlazado de funciones JS
- Página siguiente Introducción a las clases JS