¿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?
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 paraj
.En el segundo ejemplo de código que proporcionó, al utilizar la palabra clave
var
para declarari
, 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 parai
.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.