Global räknarvariabel i JavaScript

Låt oss flytta variabeln num utanför funktionerna, och därigenom göra den global:

javascriptlet 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:

javascriptlet 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:

javascriptfunction 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.

Задание 1

Avgör, utan att köra koden, vad som kommer att skrivas ut i konsolen:

javascriptlet counter = 0;
    
function test() {
  return function() {
    console.log(counter);
    counter++;
  };
}

let func = test;

let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Задание 2

Avgör, utan att köra koden, vad som kommer att skrivas ut i konsolen:

javascriptfunction 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();
Задание 3

Avgör, utan att köra koden, vad som kommer att skrivas ut i konsolen:

javascriptfunction 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();