Variable global contadora en JavaScript
Saquemos la variable num de las funciones,
haciéndola así global:
let num = 1; // variable global
function test() {
return function() {
console.log(num);
num++;
};
}
En este caso, todas las funciones devueltas modificarán esta variable global y los contadores trabajarán de manera dependiente entre sí:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // primer contador
func1(); // mostrará 1
func1(); // mostrará 2
let func2 = test(); // segundo contador
func2(); // mostrará 3
func2(); // mostrará 4
¿Por qué nuestro código anterior creaba contadores independientes? Permítanme recordarles ese código:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
El caso es que la variable num es local
dentro de la función test. Por lo tanto, cada
llamada a test genera su propia variable
local.
Por lo tanto, las funciones devueltas harán referencia
cada una a su propia variable local de la función
test. Así es exactamente como se logra la
independencia en el funcionamiento.
Si se hace que num sea una variable global,
también será un cierre. Simplemente los entornos
léxicos de las funciones devueltas hacen referencia
a la misma variable num - cualquier
cambio en esta variable será visible en
todas las funciones.
Determine, sin ejecutar el código, qué se mostrará en la consola:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Determine, sin ejecutar el código, qué se mostrará en la consola:
function test() {
let counter = 0;
return function() {
return function() {
console.log(counter);
counter++;
};
};
}
let func = test()();
let func1 = func;
let func2 = func;
func1();
func2();
func1();
func2();
Determine, sin ejecutar el código, qué se mostrará en la consola:
function test() {
let counter = 0;
return function() {
return function() {
console.log(counter);
counter++;
};
};
}
let func = test();
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();