4

Closures como "global scopes" chiquitos.

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 basicamente cuando aprovechamos la habilidad de Javascript de usar las variables que están en el scope padre de nuestro bloque de código, por eso el global scope es un closure grandote; el bloque myFunction puede usar TODAS las variables que están disponibles en el bloque inmediato anterior.
.
Usando el ejemplo que el profesor usa en esta clase:
Si tu declaras la variable saveCoins en el global scope, estarías usando el mismo principio que si usas la segunda función que escribe el profesor porque estás usando las variables que están en el scope padre.

var saveCoins = 0;

const moneyBox = (coins) => {
    saveCoins += coins;
    console.log(saveCoins);
}

moneyBox(5); //5
moneyBox(10); //15

Pero está mal visto modificar variables globales, por eso es que quieres crear variables dentro de un scope cerrado y que interactuen 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 creas un nuevo “global scope” ficticio que va a conservar todas las variables que tú quieras monitorear:
.
Ahora mira las similitudes entre el codigo de arriba y el que está justo abajo de aquí…

const moneyBox = () => {
    var saveCoins = 0;
    const countCoins = (coins) => {
        saveCoins += coins;
        console.log(saveCoins);
    }
    return countCoins;
}

let myMoneyBox = moneyBox()
myMoneyBox(4)
myMoneyBox(10)
myMoneyBox(6)

Si remueves " const moneyBox = () => {} " serían exactamente las mismas lineas de código!

//const moneyBox = () => {var saveCoins = 0;
    const countCoins = (coins) => {
        saveCoins += coins;
        console.log(saveCoins);
    }
   // return countCoins; //}

Lo que estás haciendo es simplemente bajar un nivel tu scope. Quieres que la funcion moneyBox regrese una funcion 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 use, solamente lo podrá usar la función countCoins. Al guardar el resultado de moneyBox (countCoins) en otra variable estás creando el ámbito léxico que menciona el profesor, necesario para no dejar morir ese scope.
.

Tal vez no sea la mejor explicación que encuentres, pero así lo entendí yo y de verdad me esforcé en intentar explicarlo bien. Por favor déjame saber si te ayudó y también dime si algo es ambiguo o no está claro, lo apreciaría mucho. c:.
.
Encontré esta información en este video: Learn Closures In 7 Minutes

Escribe tu comentario
+ 2
2
7369Puntos
4 años

Muy bien exploicado, gracias!!!