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.

¿Por qué al definir una variable de bucle con let, sin usar la técnica IFFE, podemos establecer un valor específico de esa variable en una función sin perderlo?

Leí páginas de MDN sobre const, let, var. El resumen de eso es que antes de ES2015 solo teníamos scope global y scope de función. En esta página de MDN hay un ejemplo de los beneficios del scope de bloque; muestra que en lugar de usar el concepto de cierre para guardar datos relacionados para una función, como el número de iteración del bucle for, se define la variable de bucle como let. Si la palabra clave let es solo para el ámbito de bloque, ¿cómo nos proporciona esta funcionalidad? ¿Existen otros lenguajes de programación que tengan este concepto?

let divClassX = document.querySelectorAll('.x');
for (let j = 0; j < 2; j++) {
divClassX[j].onclick = function (event) {
console.log('class x div\'s x ' + j)
}
}

El código anterior tiene la misma funcionalidad que:

let divClassX = document.querySelectorAll('.x');
for (var j = 0; j < 2; j++) {
divClassX[j].onclick = (function (j) {
return function (event) {
console.log('class x div\'s x ' + j)
}
})(j)
}

Supuse que alguna funcionalidad como esa existe, por lo que el siguiente código debe funcionar como el anterior, pero cuando hice clic en div1 o div2, ambas veces obtuve 2, pero esperaba uno cuando hacía clic en div1 y dos cuando hacía clic en div2.

        let div1 = document.querySelector('#div1');
        let div2 = document.querySelector('#div2');

<pre><code>    let i = 1;
    div1.onclick = function (event) {
        console.log(i);
    }
    i = i + 1;
    div2.onclick = function (event) {
        console.log(i);
    }
</code></pre>

¿Qué concepto existe que desconozco?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El concepto que existe en el código anterior del que quizás no esté al tanto es el de clausura. En el primer ejemplo de código que proporcionó, al utilizar la palabra clave let para declarar la variable del bucle, se crea una nueva vinculación para cada iteración del bucle, creando efectivamente una nueva clausura con su propio valor para la variable del bucle. Esto permite que cada evento de clic adjunto a los elementos div “recuerde” su valor respectivo para j.

    En el segundo ejemplo de código que proporcionó, al utilizar la palabra clave var para declarar i, se crea una sola vinculación que se comparte entre ambos manipuladores de eventos de clic, lo que hace que ambos manipuladores registren el mismo valor para i.

    El ámbito de bloque y la clausura son conceptos relacionados, pero no completamente intercambiables. Otros lenguajes de programación como C# y Java han tenido ámbito de bloque durante algún tiempo, pero también tienen soporte para clausuras. La implementación de Javascript del ámbito de bloque y la clausura permite un control más fino sobre el alcance de las variables y la gestión de la memoria.

Comments are closed.