Καθολική Μεταβλητή Μετρητή σε 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 γίνει καθολική μεταβλητή - αυτό θα είναι επίσης closure. Απλώς τα λεξικά περιβάλλοντα των συναρτήσεων που επιστρέφονται θα αναφέρονται στην ίδια μεταβλητή 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();