გლობალური ცვლადი-თვლარი JavaScript-ში

ცვლადი num გამოვაღოთ ფუნქციების გარეთ, რითაც ის გლობალურს ვხდით:

javascriptlet num = 1; // გლობალური ცვლადი

function test() {
  return function() {
    console.log(num);
    num++;
  };
}

ამ შემთხვევაში, ყველა დაბრუნებული ფუნქცია შეცვლის ამ გლობალურ ცვლადს და თვლარები უკვე ერთმანეთზე იქნებიან დამოკიდებულნი:

javascriptlet num = 1;

function test() {
  return function() {
    console.log(num);
    num++;
  };
}

let func1 = test(); // პირველი თვლარი
func1();  // გამოიტანს 1-ს
func1();  // გამოიტანს 2-ს

let func2 = test(); // მეორე თვლარი
func2();  // გამოიტანს 3-ს
func2();  // გამოიტანს 4-ს

რატომ აკეთებდა ჩვენი წინა კოდი დამოუკიდებელ თვლარებს? შეგახსენებთ ამ კოდს:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
    num++;
  };
};

საქმე იმაშია, რომ ცვლადი num ლოკალურია test ფუნქციის შიგნით. ამიტომ ყოველი test-ის გამოძახება ქმნის საკუთარ ლოკალურ ცვლადს.

ამიტომ, დაბრუნებული ფუნქციები მიბმულნი იქნებიან თითოეული test ფუნქციის საკუთარ ლოკალურ ცვლადზე. სწორედ ასე მიიღწევა მათი მუშაობის დამოუკიდებლობა.

num-ის გლობალურ ცვლადად გამოცხადება - ესეც ჩაკეტვაა. უბრალოდ, დაბრუნებული ფუნქციების ლექსიკური გარემოები ერთსა და იმავე ცვლად num-ზე მიუთითებენ - ნებისმიერი ცვლილება ამ ცვლადში ყველა ფუნქციაში იქნება ხილული.

Задание 1

განსაზღვრეთ, კოდის გაშუქების გარეშე, რა დაიწერება კონსოლში:

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

განსაზღვრეთ, კოდის გაშუქების გარეშე, რა დაიწერება კონსოლში:

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

განსაზღვრეთ, კოდის გაშუქების გარეშე, რა დაიწერება კონსოლში:

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