Global räknarvariabel i JavaScript
Låt oss flytta variabeln num utanför funktionerna,
och därigenom göra den global:
let num = 1; // global variabel
function test() {
return function() {
console.log(num);
num++;
};
}
I detta fall kommer alla returnerade funktioner att ändra denna globala variabel och räknarna kommer att arbeta beroende av varandra:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // första räknaren
func1(); // skriver ut 1
func1(); // skriver ut 2
let func2 = test(); // andra räknaren
func2(); // skriver ut 3
func2(); // skriver ut 4
Varför skapade vår föregående kod oberoende räknare? Låt mig påminna om den koden:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Saken är att variabeln num är lokal
inuti funktionen test. Därför skapar varje
anrop till test sin egen lokala
variabel.
Därför kommer de returnerade funktionerna att referera
var och en till sin egen lokala variabel i funktionen
test. Det är på detta sätt som oberoende
arbete uppnås.
Om man däremot gör num till en global variabel
- kommer det också att vara en stängning. Det är bara att de lexiska
omgivningarna för de returnerade funktionerna refererar
till samma variabel num - alla
ändringar av denna variabel kommer att synas i
alla funktioner.
Avgör, utan att köra koden, vad som kommer att skrivas ut i konsolen:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Avgör, utan att köra koden, vad som kommer att skrivas ut i konsolen:
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();
Avgör, utan att köra koden, vad som kommer att skrivas ut i konsolen:
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();