Un closure es la combinación entre una función y el ámbito léxico en el que esta fue declarada. Con esto, la función recuerda el ámbito con el cual se creó. Puedes entender los closures como: función interna + scope. Mira estos pasos:
Genera una función que retorna una función interna.
Esta función interna tiene un scope, el cual puede ser accedido únicamente por esta función, es decir, las variables, funciones, etc. definidas en el scope solo pueden ser accedidas por la función interna.
Como resultado, esta función internaretornada con su scope será nuestro closure.
Veamos la siguiente imagen para entenderlo mejor. En la imagen FUNCTION es la función interna de la cual hablamos.
Ámbito léxico
El ámbito léxico se refiere al alcance de una variable siguiendo la cadena de scopes. Una variable se puede abordar desde un nivel inferior hasta uno superior, pero no al contrario.
Podemos asignar la función contador a una variable (_closure_ y _closure2_). Dependiendo del valor que tenga como parámetro, cada variable cambiará el valor inicial por el ámbito léxico, por la que fue originada la variable acumulador que está vinculada con la función aumentar.
Ejemplo de closure
La mejor manera de entender un closure es por medio de un ejemplo práctico. Cuando declaramos una función dentro de nuestro global scope, estamos usando un closure.
var myVar = 'hi';
functionmyFunction() {
console.log(myVar);
}
myFuntion(); // hi
Los closures son básicamente cuando aprovechamos la habilidad de JavaScript de emplear las variables que están en el scope padre de nuestro bloque de código, por eso el global scope es un closure grande. El bloque myFunction puede utilizar TODAS las variables que están disponibles en el bloque inmediato anterior. Usando el ejemplo visto en el video:
Si tú declaras la variable saveCoins en el global scope, estarías usando el mismo principio que si emplearas la segunda función que escribe el profesor porque estás usando las variables que están en el scope padre.
Sin embargo, está mal visto modificar variables globales, por eso es que quieres crear variables dentro de un scope cerrado y que interactúen entre ellas. Entonces, declaras las variables que vas a usar dentro del scope padre del bloque que las va a modificar para que siempre pueda acceder a ellas.
Para eso originas un nuevo “global scope” ficticio que va a conservar todas las variables que tú quieras monitorear. Ahora mira las similitudes entre el código de arriba y el que está justo abajo de aquí:
Lo que estás haciendo es simplemente bajar un nivel tu scope. Quieres que la función moneyBox regrese una función que estuvo declarada dentro de sí misma porque esa función tiene acceso a ese scope que ya no va a existir para que alguien más lo utilice, solamente lo podrá emplear la función countCoins.
Al guardar el resultado de moneyBox (countCoins) en otra variable estás generando el ámbito léxico que menciona el profesor, necesario para no dejar morir ese scope.
Contribución creada con los aportes de: Andrés Guano, Héctor Eduardo López Carballo y Franks Jhon Colque Zegarra.
Aportes 46
Preguntas 12
Ordenar por:
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?
Los closures permiten acceder al ámbito de una función exterior desde una función interior. En javascript, los closures se crean cada vez que una función es creada.
Los closures no son siempre utilizados.
Un closure es cuando una función accede a una variable fuera de su contexto.
Al trabajar con closures entra en juego el concepto de alcance de las variables.
Este tema del clousure siempre es algo extraño de digerir. Sin embargo, me costó menos trabajo ahora teniendo en cuenta que se abordó con bastante detalle el tema del scope global y local en los videos anteriores. Muy bien
El tema de las closures si es primera vez que lo ves puede ser confuso, pero voy a tratar de resumir según lo que entendí.
Básicamente una closure es cuando usamos una variable de una funcion “padre” en una función “hijo”. Además para que sea una closure es que estas funciones sean anidadas (“padre-hijo”)
En este ejemplo estoy creando funciones anidadas(una dentro de otra), y estoy usando la variable “a” que está declarada en la “primeraFN” y la estoy usando en la “segundaFN”
functionprimeraFN(){
const a = 1functionsegundaFN(){
a = a + 1;
}
}
Claramente esta es la versión mas sencilla para entender inicialmente los clouseres, pero si cualquiera desea agregar mas información, o corregirme en algo bienvenido sea. 😃
Antes de ver esta clase te recomiendo pasarte por esta lectura: Execution Context
Y si quieres reforzar y entender más a profundidad los visto en la clase y en la lectura ve este video compartido por el compañero @pablozecua: video sobre closures
Básicamente el ámbito léxico es, la accesibilidad de las variables depende de si están todas dentro de una misma función o bloque.
y va de arriba hacia abajo, como cascada.
Una analogia buena para entender el clousure es que funciona como el polarizado de un auto. Uno estando dentro de un auto polarizad puede ver a los demas, como una funcion dentro de otra puede ver asi los elementos de afuera.
Pero los demas que estan afuera no pueden vernos a nosotros estando dentro del auto polarizado, al igual que las funciones de afuera no tienen acceso al scope de otros bloques.
Una clausura o closure es una función que guarda referencias del estado adyacente (ámbito léxico). En otras palabras, una clausura permite acceder al ámbito de una función exterior desde una función interior. En JavaScript, las clausuras se crean cada vez que una función es creada.
// Lexical Scope
// La función iniciar es una función externa.
function iniciar() {
// La variable nombre es una variable local creada por iniciar.
let nombre = "Hola, mundo";
// La función mostrarNombre es una función interna, una clausura.
function mostrarNombre() {
// nombre es una variable declarada en la función externa.
console.log(nombre);
}
mostrarNombre();
}
iniciar();
// output
// Hola, mundo
Las funciones en javascript pueden ser declaradas dentro de otras funciones (funciones anidadas) . Esto es algo que no ocurre en Java, C# que son lenguajes orientados a objetos (En python tambien pueden crearse closures). La particularidad de poder crear una función dentro de otra brinda a la función contenida la posibilidad de acceder a las variables declaradas en la función contenedora y por supuesto a las variables globales.
Las closures es mas una característica de las funciones en javascript que las diferencia a las creadas en otros lenguajes ya mencionados.
En un curso que imparte Diego De Granda hacía la siguiente analogía para hablar del scope:
Si tú vas por el campo, puede que pases por al lado de un hormiguero y no darte cuenta, pero las hormigas si se están dando cuenta de que tú pasas por al lado…
const myGlobal = 0;
functionmyFunction() {
const myNumber = 1;
console.log(myGlobal);
functionparent() {
const inner = 2;
console.log(myGlobal, myNumber);
functionchild() {
console.log(myGlobal, myNumber, inner);
}
return child; // No llames a child() aquí, solo devuelve la referencia a la función
}
return parent(); // Llama a parent() para obtener la referencia a la función child
}
var resultado = myFunction(); // funcion CLOSURE
resultado(); // Llama a resultado() para ejecutar la función child
En el código proporcionado, tenemos una función myFunction que tiene dos funciones internas: parent y child.
Ahora, analicemos las llamadas a las funciones y el concepto de closures:
En la línea return parent();, se llama a la función parent. Esto devuelve la referencia a la función child, pero no la ejecuta. La referencia se asigna a la variable resultado.
Luego, en la línea resultado();, se llama a resultado, que en realidad es una referencia a la función child. Al llamar a resultado(), se ejecuta la función child, lo que provoca que se impriman los valores de myGlobal, myNumber e inner.
En resumen:
La función child es una función closure porque tiene acceso a las variables locales de su función externa parent, incluso después de que parent haya finalizado su ejecución.
Al llamar a resultado() estamos ejecutando la función child, que se convierte en la función closure debido al acceso que tiene a las variables locales de parent.
Espero que esto aclare el código y el concepto de closures en este contexto.
Un closure se crea cuando una función interna hace referencia a variables de una función externa. La función interna tiene acceso a las variables y parámetros de la función externa, incluso después de que la función externa haya terminado de ejecutarse.
Aquí tienes un ejemplo para ilustrar cómo se crea un closure en JavaScript:
En el ejemplo anterior, la función contador define una variable llamada contador y una función interna llamada incrementar. La función incrementar tiene acceso a la variable contador y la puede modificar. Luego, la función contador devuelve la función incrementar.
Cuando se llama a contador() y se asigna el resultado a miContador, se crea un closure. miContador se convierte en una función que aún tiene acceso a la variable contador definida en la función contador. Cada vez que se llama a miContador(), el valor de contador se incrementa y se muestra en la consola.
El uso de closures en JavaScript es útil en situaciones donde se necesita preservar el estado de ciertas variables y tener acceso a ellas en un ámbito diferente al de su creación, como en el ejemplo anterior donde se mantiene un contador privado. Los closures son ampliamente utilizados en JavaScript para implementar patrones como módulos, funciones de retorno de llamada y manejo de eventos.
En JavaScript, una clausura o closure es una función que guarda referencias del estado adyacente (ámbito léxico). En otras palabras, una clausura permite acceder al ámbito de una función exterior desde una función interior.
En JavaScript, las clausuras se crean cada vez que una función es creada. Los closures son creados con toda la información del entorno donde fueron creados y mantienen la información de su ambiente.
Le pregunté al GPT cómo le explicaría un closure de JS a un niño de 10 años, me GUSTÓ la respuesta:
Imagina que estás jugando con bloques de construcción. En JavaScript, a veces tenemos funciones (pedacitos de código) que pueden recordar cosas incluso después de que terminaron de hacer su trabajo. Un "closure" es como si una función guardara en una cajita especial algunos de esos bloques de construcción para más tarde.
Entonces, si una función tiene una cajita especial y guarda algunos bloques adentro, incluso cuando la función termina, esos bloques siguen guardados en la cajita. Puedes pensar en esa cajita especial como un pequeño recuerdo que la función mantiene consigo.
Por ejemplo, imagina que tienes una función que cuenta cuántas veces has dado un paso. Cada vez que das un paso, la función guarda ese número en su cajita especial. Aunque la función termine, aún recuerda cuántos pasos diste porque está guardado en su cajita especial. Esa función es como un "closure" porque mantiene algo (el número de pasos) guardado incluso después de que hizo su tarea principal.
En JavaScript, un closure es una función que recuerda el estado de las variables en el momento en que se creó, incluso cuando la función se ejecuta en un entorno diferente.
En otras palabras, un closure es una función que tiene acceso a variables que están fuera de su alcance léxico, es decir, a variables que no están definidas dentro de la función en sí misma, sino en su ámbito exterior, ya sea en la función que la contiene o en el ámbito global. El closure “cierra” el ámbito en el que se creó y lo mantiene disponible para su uso posterior.
Los closures son útiles en situaciones donde se necesita acceder a variables que no están disponibles dentro de una función, como en el manejo de eventos, la implementación de funciones de devolución de llamada y la creación de módulos. Al usar closures, se pueden crear funciones que tienen acceso a variables privadas y mantenerlas aisladas del ámbito global, lo que ayuda a evitar conflictos de nombres y a escribir un código más seguro y modular.
Que es un Closure?
Los Closure permiten:
Acceder al ámbito de una función exterior desde una función interior. En JavaScript, las clausuras se crean cada vez que una función es creada.
A diferencia de otros conceptos como funciones, variables, u otros. Los closures no son siempre utilizados.
Aprender el concepto es saber identificar cuando lo estas utilizando.
Se tiene una closure cuando:
Una función cualquiera accede a una variable fuera de su contexto y la recuerda.
De forma sencilla, en JavaScript un Closure se crea cuando tenemos una funcion (Padre) y dentro tenemos funciones (Hijas), es decir tenemos funciones anidadas.
Luego gracias al “Ambito Lexico” podemos tener acceso a las variables de la funcion “Padre” desde la funcion “Hijo”.
es un manera de encapsulación, que solo la función principal tiene acceso internamente, y externamente accedimos al comportamiento de las variables y funciones.
Vi este ejemplo en los recursos de la clase y no lo entendí, así que leyendo las notas debajo de ese ejemplo he tratado de comprender como funciona. Les dejo el código y un gif del funcionamiento.
// What is a closure?
// A closure is a function that has accessto its outerfunction scope even after the outerfunction has returned.
// What is a lexical scope?
// Lexical scope means that in a nested groupoffunctions, the innerfunctions have accessto the variables and other resources of their parent scope.
Muchas veces en mi código he utilizado los Closure, pero no sabia que lo estaba utilizando. Ahora gracias a este curso se el concepto, que no esta mal saberlo.
digamos que un closure es como cuando hacemos uso de clases,nosotros podemos llamar a los parametros de dicha clase y mandarlos , en este caso un closure es una funcion la cual adentro de ella puede tener mas funciones o variables , las cuales solo se van a poder acceder a ellas fuera del contexto del scope si retornamos las mismas, segun lo que investigue esta era una forma de simular las clases antes que existieran como tal las clases en javascript!
Una clausura o closure es una funcion que guarda referencias del estado adyacente ( ambito lexico), en otras palabras una clausura permite acceder al ambito de una funcion exterior desde una funcion interior.
tengo un clousure cuando tengo function child que accede al scope function parent, esto permite acceder a cualquier variable. Así pues, mi function parent retorna la function child, esto ocasiona que el resultado sea recordado por la function child, y se pueda acceder a ella.
Permite acceder al ámbito de una función desde una función interior.En javascript,las clausuras se crean cada vez que una función es creada.
A diferencia de otros conceptos como funciones,variables u otros.Los clousures no son siempre utilizados.
Tienes una clouse cuando una función cualquiera accede a una variable fuera de su contexto.
Vamos a entender qué es una clouster con un concepto llamado ambito lexíco(accesibilidad que vamos a tener de nuestras variables anidadas dentro de condiciones y llamarlas).
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?