Πρόσβαση σε εξωτερικές μεταβλητών συναρτήσεων στο JavaScript

Ας εξετάσουμε τον ακόλουθο κώδικα:

javascriptlet num = 1; // ορίζουμε την τιμή της μεταβλητής

function func() {
  console.log(num); // την εμφανίζουμε στην κονσόλα
}

func(); // καλούμε τη συνάρτηση

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

javascriptfunction func() {
  console.log(num);
}

let num = 1;
func();

Στην πραγματικότητα, αυτό δεν είναι απολύτως ακριβές. Η συνάρτησή μας ακόμη και πριν από την κλήση της γνωρίζει την τιμή της μεταβλητής num:

javascriptlet num = 1;

function func() {
  console.log(num); // η συνάρτηση γνωρίζει ήδη ότι num = 1
}

Ακολουθεί ένα πιο σύνθετο παράδειγμα:

javascriptlet num = 1; // η συνάρτηση σε αυτή τη στιγμή μαθαίνει ότι num = 1

function func() {
  console.log(num);
}

num = 2; // η συνάρτηση σε αυτή τη στιγμή μαθαίνει ότι num = 2

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

javascriptlet num = 1; // η συνάρτηση σε αυτή τη στιγμή μαθαίνει ότι num = 1
func(); // θα εμφανίσει 1

function func() {
  console.log(num);
}

func(); // θα εμφανίσει 1
num = 2; // η συνάρτηση σε αυτή τη στιγμή μαθαίνει ότι num = 2
func(); // θα εμφανίσει 2

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