Κλεισίματα και Άμεση Κλήση Συναρτήσεων σε JavaScript

Όπως ήδη γνωρίζετε, είναι δυνατόν να καλέσετε μια ανώνυμη συνάρτηση αμέσως και να αντιστοιχίσετε το αποτέλεσμα μιας μεταβλητής:

javascriptlet result = function() {
  return '!';
}();

console.log(result); // θα εμφανίσει '!'

Συχνά, τη συνάρτηση που καλείται αμέσως, σε τέτοιες περιπτώσεις την περικλείουμε σε παρενθέσεις, αν και αυτό δεν είναι απαραίτητο. Αυτό γίνεται για να είναι αμέσως ορατό ότι η συνάρτηση καλείται αμέσως:

javascriptlet result = (function() {
  return '!';
})();

console.log(result); // θα εμφανίσει '!'

Ας κάνουμε τώρα το αποτέλεσμα της συνάρτησης που κλήθηκε αμέσως να είναι μια ανώνυμη συνάρτηση:

javascriptlet func = (function() {
  return function() {
    console.log('!');
  }
})();

func(); // θα εμφανίσει '!'

Ας κάνουμε έτσι ώστε η συνάρτηση που επιστρέφεται να αποθηκεύει στη μεταβλητή num του κλεισίματος:

javascriptlet func = (function() {
  let num = 1;
  
  return function() {
    console.log(num);
  }
})();

Εάν προσθέσετε και num++, τότε η συνάρτηση func θα γίνει ένας έτοιμος μετρητής:

javascriptlet func = (function() {
  let num = 1;
  
  return function() {
    console.log(num);
    num++;
  }
})();

func(); // θα εμφανίσει 1
func(); // θα εμφανίσει 2
func(); // θα εμφανίσει 3
func(); // θα εμφανίσει 4
func(); // θα εμφανίσει 5
Задание 1

Χωρίς να κοιτάξετε τον κώδικά μου, ανεξάρτητα υλοποιήστε έναν παρόμοιο μετρητή.

Задание 2

Τροποποιήστε τη λειτουργία του μετρητή έτσι ώστε να μετράει μέχρι 5, και μετά η μέτρηση να ξεκινά από την αρχή.