es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Qué está sucediendo *en realidad* dentro de este cierre estancado?

Siento que mi conocimiento sobre closures está casi ahí, pero me cuesta entender exactamente por qué este primer fragmento de código registra 0 (es un closure obsoleto), sin embargo, el segundo fragmento de código funciona y registra el valor actualizado ..

¿Es esto algún tipo de problema de referencia?

En el primer ejemplo, ¿no estamos rastreando la referencia de count y solo asignamos su valor inicial a message?

Al mover la variable message dentro de la función log, ¿le estamos diciendo de alguna manera a JS que rastree la referencia del valor de count?

function createIncrement() {
  let count = 0;

  function increment() {
    count++;
  }

  let message = count;
  function log() {
    console.log(message);
  }

  return [increment, log];
}

const [increment, log] = createIncrement();

increment();
log();

// esto registrará 0

function createIncrement() {
  let count = 0;

  function increment() {
    count++;
  }

  function log() {
    let message = count;
    console.log(message);
  }

  return [increment, log];
}

const [increment, log] = createIncrement();

increment();
log();

// esto registrará 1

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema con el primer fragmento de código es que la variable “message” se le asigna el valor inicial de “count” en el momento de su creación, que es 0. Cuando se llama a la función “log”, registra el valor de “message”, que sigue siendo 0 porque no se actualiza dinámicamente. Esto se debe a que “message” no es un cierre y no tiene una referencia a la variable “count”.

    En el segundo fragmento de código, la variable “message” se declara dentro de la función “log”, lo que la convierte en un cierre y le da acceso a la variable “count”. Esto significa que cuando se llama a la función “log”, registra el valor actual de “count”, que ha sido actualizado por la función “increment”.

    Por lo tanto, no es un problema de referencia, sino más bien una cuestión de utilizar cierres para crear una referencia a la variable “count”. Al mover la declaración de “message” dentro de la función “log”, estamos creando un cierre que mantiene una referencia a la variable “count” y nos permite registrar su valor actualizado.

Comments are closed.