Εφαρμογή του Λεξικού Περιβάλλοντος Συναρτήσεων στο JavaScript
Ας υποθέσουμε ότι έχουμε μια συνάρτηση, που επιστρέφει ως αποτέλεσμα μια άλλη συνάρτηση:
function test() {
return function() {
}
}
Εάν η γονική συνάρτηση έχει οποιεσδήποτε μεταβλητές, τότε αυτές οι μεταβλητές θα περιέχονται στο λεξικό περιβάλλον της συνάρτησης που επιστρέφεται:
function test() {
let num = 1; // μεταβλητή της γονικής συνάρτησης
return function() {
// λεξικό περιβάλλον = {num: 1}
}
}
Ας γράψουμε στον κώδικα της συνάρτησης που επιστρέφουμε
ένα console.log, που να εμφανίζει την τιμή της μεταβλητής
num:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
Ας καλέσουμε τώρα τη γονική συνάρτηση
test και το αποτέλεσμα της εργασίας της να το καταγράψουμε
σε μια μεταβλητή func:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
Στη μεταβλητή func θα καταγραφεί η συνάρτηση που επιστρέφεται.
Ας καλέσουμε τη συνάρτησή μας - ως αποτέλεσμά της θα εμφανίσει το περιεχόμενο της μεταβλητής
num:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func(); // θα εμφανίσει 1
Εάν, ωστόσο, κάποιος απλώς προσπαθήσει να εμφανίσει τη μεταβλητή
num έξω από τη συνάρτηση - αυτή δεν θα είναι προσβάσιμη:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
console.log(num); // η μεταβλητή num εδώ δεν είναι προσβάσιμη
Όπως βλέπετε, η τοπική μεταβλητή num
δέθηκε στο λεξικό περιβάλλον της συνάρτησής μας
και τώρα, καλώντας σε οποιοδήποτε σημείο του κώδικα
αυτή τη συνάρτηση, μπορούμε να πάρουμε την τιμή
της μεταβλητής num, ακόμα κι αν στο σημείο
κλήσης η ίδια η μεταβλητή δεν είναι προσβάσιμη.
Στην πραγματικότητα, ένα ανάλογο αποτέλεσμα μπορεί να
επιτευχθεί κάνοντας τη μεταβλητή num καθολική:
function test() {
return function() {
console.log(num);
}
}
let num = 1; // καθολική μεταβλητή
let func = test();
func(); // θα εμφανίσει 1
Εδώ, ωστόσο, θα υπάρχει μια σημαντική διαφορά:
στη νέα εκδοχή η μεταβλητή num μπορεί
να αλλάζει έξω από τις συναρτήσεις (καθώς είναι καθολική),
ενώ στην παλιά - όχι.
Προσδιορίστε, χωρίς να εκτελέσετε τον κώδικα, τι θα εμφανιστεί στην κονσόλα:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
let func = test();
console.log(func());
Προσδιορίστε, χωρίς να εκτελέσετε τον κώδικα, τι θα εμφανιστεί στην κονσόλα:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
console.log(test()());
Προσδιορίστε, χωρίς να εκτελέσετε τον κώδικα, τι θα εμφανιστεί στην κονσόλα:
function test() {
let num1 = 1;
return function() {
return num1 + num2;
}
}
let num2 = 2;
let func = test();
console.log(func());
Προσδιορίστε, χωρίς να εκτελέσετε τον κώδικα, τι θα εμφανιστεί στην κονσόλα:
function test() {
let num = 1;
return function() {
return num;
}
}
let num = 2;
let func = test();
console.log(func());