Σε αυτό το σεμινάριο, θα μάθετε για το κλείσιμο JavaScript με τη βοήθεια παραδειγμάτων.
Πριν μάθετε για το κλείσιμο, πρέπει να καταλάβετε δύο έννοιες:
- Ένθετη συνάρτηση
- Επιστροφή συνάρτησης
Συνδεμένη συνάρτηση JavaScript
Στο JavaScript, μια συνάρτηση μπορεί επίσης να περιέχει μια άλλη συνάρτηση. Αυτό ονομάζεται ένθετη συνάρτηση. Για παράδειγμα,
// nested function example // outer function function greet(name) ( // inner function function displayName() ( console.log('Hi' + ' ' + name); ) // calling inner function displayName(); ) // calling outer function greet('John'); // Hi John
Στο παραπάνω πρόγραμμα, η greet()
συνάρτηση περιέχει τη displayName()
συνάρτηση μέσα σε αυτό.
Επιστρέφοντας μια συνάρτηση
Στο JavaScript, μπορείτε επίσης να επιστρέψετε μια συνάρτηση μέσα σε μια συνάρτηση. Για παράδειγμα,
function greet(name) ( function displayName() ( console.log('Hi' + ' ' + name); ) // returning a function return displayName; ) const g1 = greet('John'); console.log(g1); // returns the function definition g1(); // calling the function
Παραγωγή
function displayName () (console.log ("Hi" + "+ name);) Γεια John
Στο παραπάνω πρόγραμμα, η greet()
συνάρτηση επιστρέφει τον displayName
ορισμό της συνάρτησης.
Εδώ, ο ορισμός της επιστρεφόμενης συνάρτησης εκχωρείται στη μεταβλητή g1. Όταν εκτυπώνετε το g1 χρησιμοποιώντας console.log(g1)
, θα λάβετε τον ορισμό της λειτουργίας.
Για να καλέσουμε τη συνάρτηση που είναι αποθηκευμένη στη μεταβλητή g1, χρησιμοποιούμε g1()
με παρενθέσεις.
Κλείσιμο JavaScript
Στο JavaScript, το κλείσιμο παρέχει πρόσβαση στο εξωτερικό εύρος μιας συνάρτησης από το εσωτερικό της εσωτερικής λειτουργίας, ακόμη και μετά το κλείσιμο της εξωτερικής λειτουργίας. Για παράδειγμα,
// javascript closure example // outer function function greet() ( // variable defined outside the inner function let name = 'John'; // inner function function displayName() ( // accessing name variable return 'Hi' + ' ' + name; ) return displayName; ) const g1 = greet(); console.log(g1); // returns the function definition console.log(g1()); // returns the value
Παραγωγή
function displayName () (// πρόσβαση μεταβλητής ονόματος επιστροφή "Hi" + "+ name;) Γεια John
Στο παραπάνω παράδειγμα, όταν greet()
καλείται συνάρτηση, επιστρέφει τον ορισμό της συνάρτησης του displayName
.
Εδώ, g1
είναι μια αναφορά στη displayName()
συνάρτηση.
Όταν g1()
καλείται, εξακολουθεί να έχει πρόσβαση στη greet()
λειτουργία.
Όταν εκτελούμε console.log(g1)
, επιστρέφει τον ορισμό της συνάρτησης.
Η έννοια του κλεισίματος υπάρχει για άλλες γλώσσες προγραμματισμού όπως Python, Swift, Ruby κ.λπ.
Ας ρίξουμε μια ματιά σε ένα άλλο παράδειγμα.
// closure example function calculate(x) ( function multiply(y) ( return x * y; ) return multiply; ) const multiply3 = calculate(3); const multiply4 = calculate(4); console.log(multiply3); // returns calculate function definition console.log(multiply3()); // NaN console.log(multiply3(6)); // 18 console.log(multiply4(2)); // 8
Στο παραπάνω πρόγραμμα, η calculate()
συνάρτηση παίρνει ένα μόνο όρισμα x
και επιστρέφει τον ορισμό της multiply()
συνάρτησης. Η multiply()
συνάρτηση παίρνει ένα μόνο όρισμα y
και επιστρέφει x * y
.
Και τα δύο multiply3
και multiply4
είναι κλείσιμο.
Η calculate()
συνάρτηση ονομάζεται μεταβίβαση μιας παραμέτρου x
. Όταν multiply3
και multiply4
καλείται, η multipy()
συνάρτηση έχει πρόσβαση στο πέρασμα x του εξωτερικού συνόλου calculate()
.
Ιδιωτικότητα δεδομένων
Το κλείσιμο JavaScript βοηθά στο απόρρητο δεδομένων του προγράμματος. Για παράδειγμα,
let a = 0; function sum() ( function increaseSum() ( // the value of a is increased by 1 return a = a + 1; ) return increaseSum; ) const x = sum(); console.log(x()); // 1 console.log(x()); // 2 console.log(x()); // 3 a = a + 1; console.log(a); // 4
Στο παραπάνω παράδειγμα, η sum()
συνάρτηση επιστρέφει τον ορισμό της increaseSum()
συνάρτησης.
Η μεταβλητή αυξάνεται μέσα στη increaseSum()
συνάρτηση. Ωστόσο, η τιμή μιας μεταβλητής μπορεί επίσης να αλλάξει εκτός της συνάρτησης. Σε αυτήν την περίπτωση, a = a + 1;
αλλάζει την τιμή της μεταβλητής εκτός της συνάρτησης.
Τώρα, εάν θέλετε μια μεταβλητή να αυξάνεται μόνο μέσα στη συνάρτηση, μπορείτε να χρησιμοποιήσετε ένα κλείσιμο. Για παράδειγμα,
function sum() ( let a = 0; function increaseSum() ( // the value of a is increased by 1 return a = a + 1; ) return increaseSum; ) let x = sum(); let a = 5; console.log(x()); // 1 console.log(x()); // 2 console.log(a); // 5
Στο παραπάνω παράδειγμα, η sum()
συνάρτηση ορίζει την τιμή a έως 0 και επιστρέφει τη increaseSum()
συνάρτηση.
Λόγω του κλεισίματος, παρόλο που sum()
έχει ήδη εκτελεστεί, increaseSum()
εξακολουθεί να έχει πρόσβαση σε ένα και μπορεί να προσθέσει 1 σε κάθε φορά x()
που καλείται.
Και η μεταβλητή είναι ιδιωτική για τη sum()
συνάρτηση. Αυτό σημαίνει ότι η μεταβλητή είναι προσβάσιμη μόνο εντός της sum()
συνάρτησης.
Ακόμα και αν το δηλώσετε a
και το χρησιμοποιήσετε, δεν επηρεάζει τη a
μεταβλητή στο εσωτερικό της sum()
συνάρτησης.
Σημείωση : Γενικά, το κλείσιμο χρησιμοποιείται για το απόρρητο των δεδομένων.