3

Verán estaba practicando Closures en JavaScript he hice este código

function contador(numero){
   
  return function(){
    numero = numero +1
    return numero
  }

}

const contador1 = contador(24)
console.log(contador1())
console.log(contador1())
console.log(contador1())
console.log(contador1())

Me detuve a pensar y comprendo que la función que he retornado puede acceder a la variable numero que esta como parámetro en función contador porque esta dentro del ámbito de la función contador pero ¿no se supone que las variables dejan de existir y se destruyen cuando la función termina de ejecutarse? y vuelven a existir cuando la función es invocada de nuevo? o en JavaScript las variables siempre existen y para acceder a ellas solo debemos estar dentro del ámbito en el que están definidas sin importar que sea dentro de una función?

Se que queda como una referencia a ese ambito gracias a la funcion que retorno pero siempre he conocido el concepto de que las variables dejan de existir cuando la funcion termina de ejecutarse, la funcion deja de ejecutarse y retorna como valor una funcion pero no logro entender el como esa funcion puede acceder a las variables de la funcion en la que esta contenida ya que estas variables dejan de existir cuando la funcion termina de ejecutarse y solo existen cuando esta se esta ejecutando

Pablo Rivas
  • 123
  • 3
  • Puedes leer las respuestas de [esta](https://es.stackoverflow.com/questions/607/c%c3%b3mo-funcionan-las-clausuras-en-javascript) pregunta, seguramente te ayudará a entender las Clausuras en Javascript. Saludos – Mauricio Contreras May 20 '19 at 00:33
  • 7
    Posible duplicado de [¿Cómo funcionan las clausuras en JavaScript?](https://es.stackoverflow.com/questions/607/c%c3%b3mo-funcionan-las-clausuras-en-javascript) – Mauricio Contreras May 20 '19 at 00:35
  • Respecto al último párrafo, eso es en general correcto con la excepción de las clausuras (que son relativamente recientes en los lenguajes más extendidos). E incluso en caso de clausuras depende del lenguaje; por ejemplo Java lo que hace es guardar *una copia* del valor en una variable propia de la clausura; por eso exige que las variables a las que accedan sean *final* (constantes), para que después de copiar el valor no se pueda cambiar el valor de la variable original (con lo cual ya no funcionaría como clausura). – SJuan76 May 20 '19 at 00:52

1 Answers1

0

Voy a probar a mostrartelo con unos ejemplos:

{var prueba = "probando"}
console.log(window.prueba);

En este caso muestro como lo que declaras con var lo esta tomando window.

{ let prueba = "probando" }
console.log(prueba); //error

Lo que declaras con let muere fuera de los limites que marcan las llaves ({}).

var diogenes = function(cosa = "") {
 arguments.callee.acumula ||= "";
 arguments.callee.acumula += " " + cosa;
 return arguments.callee.acumula; 
}

// acumula solo existe dentro de diogenes pero no muere al terminar la ejecucion de la funcion.

console.log(diogenes(2));
console.log(diogenes("veintidos"));
console.log(diogenes("CCXXII"));

El ultimo es un extra para mostrarte un tip que conozco para usar variables estaticas.

arguments.callee te permite mantener viva una variable dentro de una funcion siempre y cuando sea declarada con function (para las que se llaman con "=>" no funciona). Es decir, las tipo (entrada) => { return entrada; } no valen para esto.

NOTA: El log de la consola del snippet tarda un pelin en salir, solo espera unos segundos y veras el error o resultado que tenga que salir.

t33st33r
  • 1
  • 4