Μετρητής με closures στην JavaScript
Ας ξαναγράψουμε τον κώδικα που εξετάσαμε
έτσι ώστε η συνάρτηση που επιστρέφεται κάθε φορά
να αυξάνει την τιμή της μεταβλητής num
κατά μία μονάδα:
function test() {
let num = 1;
return function() {
console.log(num);
num++; // προσθέτουμε μονάδα
}
}
let func = test();
Αποτέλεσμα είναι ότι κάθε κλήση της συνάρτησης func
θα εμφανίζει στη κονσόλα μια νέα τιμή:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
}
}
let func = test();
func(); // θα εμφανίσει 1
func(); // θα εμφανίσει 2
func(); // θα εμφανίσει 3
func(); // θα εμφανίσει 4
func(); // θα εμφανίσει 5
Αποτέλεσμα είναι ότι υλοποιήσαμε έναν μετρητή κλήσεων
συναρτήσεων, χρησιμοποιώντας closure (πιο συγκεκριμένα χρησιμοποιώντας
τη μεταβλητή num από το closure της συνάρτησής μας).
Λάβετε υπόψη ότι κάθε κλήση της συνάρτησης test
θα επιστρέφει μια νέα συνάρτηση, η οποία
θα έχει το δικό της closure. Δηλαδή διαφορετικοί μετρητές
θα λειτουργούν ανεξάρτητα:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // πρώτος μετρητής
func1(); // θα εμφανίσει 1
func1(); // θα εμφανίσει 2
let func2 = test(); // δεύτερος μετρητής
func2(); // θα εμφανίσει 1
func2(); // θα εμφανίσει 2
Αποτέλεσμα είναι ότι η ίδια μεταβλητή num
για διαφορετικές συναρτήσεις θα έχει διαφορετική τιμή!
Δηλαδή, αν καλέσουμε τη συνάρτηση test
δύο φορές, τότε οι συναρτήσεις που θα ληφθούν από αυτήν
θα λειτουργούν ανεξάρτητα και κάθε μια από
αυτές τις συναρτήσεις θα έχει τη δική της ανεξάρτητη
μεταβλητή num.
Ανεξάρτητα, χωρίς να κοιτάτε τον κώδικά μου, υλοποιήστε έναν μετρητή κλήσης συνάρτησης, που να λειτουργεί με closures.
Αφήστε τη συνάρτηση στο closure να αποθηκεύει τον αριθμό 10.
Κάντε έτσι ώστε κάθε κλήση της συνάρτησης
να μειώνει αυτόν τον αριθμό κατά 1 και να εμφανίζει
στη κονσόλα τον μειωμένο αριθμό.
Τροποποιήστε το προηγούμενο πρόβλημα έτσι ώστε
η αντίστροφη μέτρηση να φτάνει μέχρι 0, και στη συνέχεια κάθε
επόμενη κλήση της συνάρτησης να εμφανίζει στη κονσόλα
ένα μήνυμα ότι η αντίστροφη μέτρηση ολοκληρώθηκε.