Καθολική Μεταβλητή Μετρητή σε JavaScript
Θα βγάλουμε τη μεταβλητή num έξω από τις συναρτήσεις,
κάνοντάς την έτσι καθολική:
let num = 1; // καθολική μεταβλητή
function test() {
return function() {
console.log(num);
num++;
};
}
Σε αυτή την περίπτωση, όλες οι συναρτήσεις που επιστρέφονται θα τροποποιούν αυτή την καθολική μεταβλητή και οι μετρητές θα λειτουργούν πλέον εξαρτημένοι ο ένας από τον άλλο:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // πρώτος μετρητής
func1(); // θα εμφανίσει 1
func1(); // θα εμφανίσει 2
let func2 = test(); // δεύτερος μετρητής
func2(); // θα εμφανίσει 3
func2(); // θα εμφανίσει 4
Γιατί όμως ο προηγούμενος κώδικάς μας δημιουργούσε ανεξάρτητους μετρητές; Θα θυμηθώ αυτόν τον κώδικα:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Το θέμα είναι ότι η μεταβλητή num είναι τοπική
μέσα στη συνάρτηση test. Επομένως, κάθε
κλήση της test δημιουργεί τη δική της τοπική
μεταβλητή.
Γι' αυτό οι συναρτήσεις που επιστρέφονται θα αναφέρονται
καθεμία στη δική της τοπική μεταβλητή της συνάρτησης
test. Ακριβώς έτσι επιτυγχάνεται η ανεξαρτησία
λειτουργίας.
Εάν όμως η num γίνει καθολική μεταβλητή
- αυτό θα είναι επίσης closure. Απλώς τα λεξικά περιβάλλοντα
των συναρτήσεων που επιστρέφονται θα αναφέρονται
στην ίδια μεταβλητή num - οποιεσδήποτε
αλλαγές σε αυτή τη μεταβλητή θα είναι ορατές σε
όλες τις συναρτήσεις.
Προσδιορίστε, χωρίς να εκτελέσετε τον κώδικα, τι θα εμφανιστεί στην κονσόλα:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Προσδιορίστε, χωρίς να εκτελέσετε τον κώδικα, τι θα εμφανιστεί στην κονσόλα:
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();
Προσδιορίστε, χωρίς να εκτελέσετε τον κώδικα, τι θα εμφανιστεί στην κονσόλα:
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();