Κατανόηση των κλείσιμων JavaScript σε βρόχους: Πρακτικά παραδείγματα

JavaScript

Αποκάλυψη κλεισίματος βρόχου σε JavaScript

Οι προγραμματιστές JavaScript συχνά αντιμετωπίζουν απροσδόκητη συμπεριφορά όταν χρησιμοποιούν κλεισίματα μέσα σε βρόχους. Αυτό το πρόβλημα μπορεί να οδηγήσει σε σύγχυση, ειδικά για όσους είναι νέοι στην έννοια του κλεισίματος.

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

Εντολή Περιγραφή
let Δηλώνει μια τοπική μεταβλητή με εύρος μπλοκ, αρχικοποιώντας την προαιρετικά σε μια τιμή. Χρησιμοποιείται για να διασφαλιστεί ότι κάθε επανάληψη του βρόχου έχει το δικό της εύρος.
const Δηλώνει μια σταθερά με εύρος μπλοκ, με όνομα μόνο για ανάγνωση. Χρησιμοποιείται για τη δημιουργία συνάρτησης ή μεταβλητής της οποίας η τιμή δεν πρέπει να αλλάξει.
Promise Αντιπροσωπεύει την ενδεχόμενη ολοκλήρωση (ή αποτυχία) μιας ασύγχρονης λειτουργίας και την προκύπτουσα τιμή της.
setTimeout Καλεί μια συνάρτηση ή αξιολογεί μια παράσταση μετά από έναν καθορισμένο αριθμό χιλιοστών του δευτερολέπτου.
addEventListener Επισυνάπτει ένα πρόγραμμα χειρισμού συμβάντων σε ένα καθορισμένο στοιχείο χωρίς να αντικαθιστά τους υπάρχοντες χειριστές συμβάντων.
IIFE Έκφραση συνάρτησης που επικαλείται αμέσως. Μια συνάρτηση που εκτελείται μόλις οριστεί. Χρησιμοποιείται για τη δημιουργία τοπικών πεδίων σε βρόχους.
for...in Επαναλαμβάνει πάνω από τις αναρίθμητες ιδιότητες ενός αντικειμένου, με αυθαίρετη σειρά.
for...of Επαναλαμβάνει τις τιμές ενός επαναλαμβανόμενου αντικειμένου (όπως ένας πίνακας ή μια συμβολοσειρά), με συγκεκριμένη σειρά.

Κατανόηση των κλείσιμων JavaScript σε βρόχους

Τα σενάρια που παρέχονται στα προηγούμενα παραδείγματα αντιμετωπίζουν το κοινό πρόβλημα κλεισίματος εντός βρόχων στο JavaScript. Όταν χρησιμοποιείτε α δήλωση εντός ενός βρόχου, όλες οι επαναλήψεις μοιράζονται το ίδιο εύρος λειτουργίας. Αυτός είναι ο λόγος για τον οποίο, στο πρώτο παράδειγμα, η έξοδος είναι "Η τιμή μου: 3" τρεις φορές. Η λύση είναι η χρήση , το οποίο δημιουργεί ένα εύρος μπλοκ που διατηρεί τη σωστή τιμή για κάθε επανάληψη. Αυτή η προσέγγιση διασφαλίζει ότι κάθε επανάληψη έχει το δικό της εύρος, διατηρώντας έτσι τη σωστή τιμή όταν καλείται η συνάρτηση. Το σενάριο δείχνει πώς αλλάζει η δήλωση από προς την let διορθώνει το πρόβλημα και καταγράφει τα "Η τιμή μου: 0", "Η τιμή μου: 1" και "Η τιμή μου: 2" όπως προβλέπεται.

Για τον ασύγχρονο κώδικα, μπορεί να προκύψει το ίδιο ζήτημα κλεισίματος. Χρησιμοποιώντας και λειτουργίες με διασφαλίζει ότι κάθε ασύγχρονη κλήση διατηρεί τη σωστή τιμή επανάληψης. Το σενάριο δείχνει ότι χρησιμοποιώντας wait με , κάθε επιλυμένη υπόσχεση καταγράφει την αναμενόμενη τιμή. Οι ακροατές εκδηλώσεων μπορούν επίσης να αντιμετωπίσουν παρόμοια προβλήματα. ωστόσο, τυλίγοντας τη συνάρτηση ακροατή σε ένα Το (Immediately Invoked Function Expression) βοηθά στη λήψη της σωστής τιμής δημιουργώντας ένα νέο πεδίο για κάθε επανάληψη. Η χρήση του και for...of Οι βρόχοι καταδεικνύουν περαιτέρω τη σημασία της οριοθέτησης στο κλείσιμο, δείχνοντας πώς να συλλάβετε σωστά το δείκτη και την τιμή χρησιμοποιώντας για να δημιουργήσετε ξεχωριστά πεδία για κάθε επανάληψη βρόχου.

Επίλυση προβλημάτων κλεισίματος σε βρόχους JavaScript με let

JavaScript (ES6)

let funcs = [];
// Let's create 3 functions
for (let i = 0; i < 3; i++) {
  // and store them in funcs
  funcs[i] = function() {
    // each should log its value.
    console.log("My value:", i);
  };
}
for (let j = 0; j < 3; j++) {
  // and now let's run each one to see
  funcs[j]();
}

Διασφάλιση σωστών τιμών κλεισίματος σε ασύγχρονο κώδικα

JavaScript (ES6)

const wait = (ms) => new Promise((resolve, reject) => setTimeout(resolve, ms));
for (let i = 0; i < 3; i++) {
  // Log `i` as soon as each promise resolves.
  wait(i * 100).then(() => console.log(i));
}

Σωστό κλείσιμο σε ακροατές συμβάντων με χρήση IIFE

JavaScript (ES6)

var buttons = document.getElementsByTagName("button");
// Let's create 3 functions
for (var i = 0; i < buttons.length; i++) {
  // as event listeners
  (function(i) {
    buttons[i].addEventListener("click", function() {
      // each should log its value.
      console.log("My value:", i);
    });
  })(i);
}

Σωστό κλείσιμο με for...in και for...of Loops

JavaScript (ES6)

const arr = [1, 2, 3];
const fns = [];
for (const i in arr) {
  fns.push(((i) => () => console.log("index:", i))(i));
}
for (const v of arr) {
  fns.push(((v) => () => console.log("value:", v))(v));
}
for (const n of arr) {
  const obj = { number: n };
  fns.push(((n, obj) => () => console.log("n:", n, "|", "obj:", JSON.stringify(obj)))(n, obj));
}
for (const f of fns) {
  f();
}

Διερεύνηση της χρήσης κλεισίματος σε προηγμένες λειτουργίες JavaScript

Τα κλεισίματα είναι μια θεμελιώδης έννοια της JavaScript που επιτρέπουν σε μια συνάρτηση να έχει πρόσβαση σε μεταβλητές από το εύρος της, ακόμη και μετά το κλείσιμο αυτού του εύρους. Αυτή η δυνατότητα είναι ιδιαίτερα ισχυρή όταν δημιουργείτε προηγμένες λειτουργίες, όπως αυτές που χρησιμοποιούνται στην απομνημόνευση, το currying και τον λειτουργικό προγραμματισμό. Για παράδειγμα, η απομνημόνευση αξιοποιεί τα κλεισίματα για να θυμάται τα αποτελέσματα δαπανηρών κλήσεων συναρτήσεων και να επιστρέφει το αποτέλεσμα που έχει αποθηκευτεί στην κρυφή μνήμη όταν εμφανίζονται ξανά οι ίδιες είσοδοι. Χρησιμοποιώντας κλεισίματα, μπορούμε να δημιουργήσουμε πιο αποτελεσματικό και βελτιστοποιημένο κώδικα που βελτιώνει την απόδοση, ειδικά σε αναδρομικές συναρτήσεις όπως ο υπολογισμός των ακολουθιών Fibonacci.

Μια άλλη προηγμένη χρήση των κλεισίματος είναι η δημιουργία ιδιωτικών μεταβλητών και συναρτήσεων εντός αντικειμένων JavaScript, προσομοίωσης ιδιωτικών μεθόδων και ιδιοτήτων. Αυτή η τεχνική χρησιμοποιείται συχνά σε μοτίβα δομοστοιχείων και επικαλείται αμέσως τις εκφράσεις συνάρτησης (IIFE) για να ενθυλακώσει τη λειτουργικότητα και να αποφύγει τη μόλυνση του παγκόσμιου εύρους. Επιπλέον, τα κλεισίματα διαδραματίζουν κρίσιμο ρόλο στον χειρισμό συμβάντων και στον ασύγχρονο προγραμματισμό, όπου βοηθούν στη διατήρηση της κατάστασης και του πλαισίου με την πάροδο του χρόνου. Η κατανόηση και η αποτελεσματική χρήση κλεισίματος μπορεί να βελτιώσει σημαντικά τις δεξιότητες προγραμματισμού JavaScript και να σας επιτρέψει να γράψετε πιο αρθρωτό, επαναχρησιμοποιήσιμο και συντηρήσιμο κώδικα.

  1. Τι είναι το κλείσιμο σε JavaScript;
  2. Το κλείσιμο είναι μια συνάρτηση που διατηρεί πρόσβαση στο λεξικό της πεδίο, ακόμη και όταν η συνάρτηση εκτελείται εκτός αυτού του πεδίου εφαρμογής.
  3. Γιατί συμβαίνουν κλεισίματα σε βρόχους;
  4. Τα κλεισίματα στους βρόχους συμβαίνουν επειδή ο βρόχος δημιουργεί συναρτήσεις που καταγράφουν την ίδια αναφορά μεταβλητής, οδηγώντας σε απροσδόκητη συμπεριφορά εάν δεν αντιμετωπιστεί σωστά.
  5. Πώς μπορούμε να διορθώσουμε προβλήματα κλεισίματος σε βρόχους;
  6. Χρησιμοποιώντας αντί σε βρόχους ή χρήση Οι (Immediately Invoked Function Expressions) μπορούν να διορθώσουν ζητήματα κλεισίματος δημιουργώντας ένα νέο πεδίο εφαρμογής για κάθε επανάληψη.
  7. Τι είναι το IIFE;
  8. Ενα είναι μια συνάρτηση που εκτελείται αμέσως μετά τη δημιουργία της, χρησιμοποιείται συχνά για τη δημιουργία ενός νέου πεδίου και την αποφυγή διενέξεων μεταβλητών.
  9. Μπορούν τα κλεισίματα να χρησιμοποιηθούν σε ασύγχρονο προγραμματισμό;
  10. Ναι, τα κλεισίματα είναι απαραίτητα στον ασύγχρονο προγραμματισμό για τη διατήρηση της κατάστασης και του πλαισίου σε ασύγχρονες λειτουργίες όπως υποσχέσεις και επανάκληση.
  11. Τι είναι η απομνημόνευση και πώς βοηθούν τα κλεισίματα;
  12. Η απομνημόνευση είναι μια τεχνική βελτιστοποίησης για την προσωρινή αποθήκευση των αποτελεσμάτων δαπανηρών κλήσεων συναρτήσεων. Τα κλεισίματα βοηθούν διατηρώντας την πρόσβαση στην κρυφή μνήμη σε πολλές κλήσεις λειτουργιών.
  13. Πώς βοηθούν τα κλεισίματα στη διαχείριση εκδηλώσεων;
  14. Τα κλεισίματα διατηρούν την κατάσταση των μεταβλητών που χρειάζονται οι χειριστές συμβάντων, διασφαλίζοντας ότι λειτουργούν σωστά όταν ενεργοποιείται το συμβάν.
  15. Ποιο είναι το μοτίβο της ενότητας στο JavaScript;
  16. Το μοτίβο της μονάδας χρησιμοποιεί κλεισίματα για τη δημιουργία ιδιωτικών μεταβλητών και συναρτήσεων, ενσωματώνοντας τη λειτουργικότητα και αποφεύγοντας τη ρύπανση σε παγκόσμιο επίπεδο.
  17. Μπορούν τα κλεισίματα να προσομοιώσουν ιδιωτικές μεθόδους σε JavaScript;
  18. Ναι, τα κλεισίματα μπορούν να προσομοιώσουν ιδιωτικές μεθόδους διατηρώντας τις μεταβλητές και τις συναρτήσεις προσβάσιμες μόνο εντός του πεδίου εφαρμογής της συνάρτησης όπου ορίζονται.

Η εκμάθηση κλεισίματος σε JavaScript, ιδιαίτερα εντός βρόχων, είναι ζωτικής σημασίας για τη σύνταξη προβλέψιμου και αποτελεσματικού κώδικα. Με μόχλευση , , και , οι προγραμματιστές μπορούν να αποφύγουν κοινές παγίδες και να εξασφαλίσουν τη σωστή μεταβλητή εύρους. Αυτή η κατανόηση ενισχύει την ικανότητα χειρισμού ασύγχρονων εργασιών και προγραμματισμού που βασίζεται σε συμβάντα, οδηγώντας τελικά σε πιο ισχυρές εφαρμογές.