Variável Global de Contador em JavaScript
Vamos colocar a variável num fora das funções,
tornando-a assim global:
let num = 1; // variável global
function test() {
return function() {
console.log(num);
num++;
};
}
Neste caso, todas as funções retornadas irão alterar esta variável global e os contadores irão funcionar de forma dependente um do outro:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // primeiro contador
func1(); // exibirá 1
func1(); // exibirá 2
let func2 = test(); // segundo contador
func2(); // exibirá 3
func2(); // exibirá 4
Por que nosso código anterior criava contadores independentes? Lembre-se deste código:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
O fato é que a variável num é local
dentro da função test. Portanto, cada
chamada de test cria sua própria variável
local.
Portanto, as funções retornadas irão referenciar
cada uma a sua própria variável local da função
test. É assim que a independência de
operação é alcançada.
Se num for tornada uma variável global
- isso ainda será um closure. Simplesmente os ambientes
lexicais das funções retornadas referenciam
a mesma variável num - quaisquer
alterações nesta variável serão visíveis em
todas as funções.
Determine, sem executar o código, o que será exibido no console:
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, sem executar o código, o que será exibido no console:
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, sem executar o código, o que será exibido no console:
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();