Sobes.tech
Junior

Σε ποιες συνέπειες μπορεί να οδηγήσει η δήλωση μιας μεταβλητής με χρήση var μέσα σε μια λειτουργία;

sobes.tech AI

Απάντηση από AI

Η δήλωση μιας μεταβλητής με var μέσα σε μια λειτουργία έχει λειτουργική εμβέλεια. Αυτό σημαίνει ότι τέτοια μεταβλητή είναι διαθέσιμη σε ολόκληρη τη λειτουργία, αγνοώντας τις μπλοκ εμβέλειες (π.χ., μέσα σε if ή for).

Συνέπειες:

  • Επαναγραφή μεταβλητών: Μια μεταβλητή που δηλώνεται με var σε ένα μπλοκ μπορεί να επαναγράψει μια άλλη μεταβλητή με το ίδιο όνομα που έχει δηλωθεί προηγουμένως στην ίδια λειτουργία, αλλά έξω από αυτό το μπλοκ.
  • Hoisting (ανύψωση): Η δήλωση μιας μεταβλητής με var ανυψώνεται στην αρχή της λειτουργίας. Αυτό σημαίνει ότι μπορείτε να χρησιμοποιήσετε τη μεταβλητή πριν από τη δήλωσή της, αλλά η τιμή της σε εκείνη τη στιγμή θα είναι undefined.
  • Απρόβλεπτη συμπεριφορά σε βρόχους: Σε βρόχους for με ασύγχρονες λειτουργίες (π.χ., setTimeout), η μεταβλητή που δηλώνεται με var θα έχει την τελευταία τιμή του βρόχου για όλα τα ασύγχρονα callback, όχι την τιμή τη στιγμή της επανάληψης.

Παράδειγμα ανύψωσης και επαναγραφής:

function παράδειγμαScopeVar() {
  console.log(a); // undefined (λόγω hoisting)
  var a = 10;
  if (true) {
    var a = 20; // Επαναγράφει την εξωτερική μεταβλητή 'a'
    console.log(a); // 20
  }
  console.log(a); // 20 (τιμή από το if)
}

παράδειγμαScopeVar();

Παράδειγμα με βρόχο και ασύγχρονες λειτουργίες:

function παράδειγμαΒρόχουVar() {
  for (var i = 0; i < 3; i++) {
    setTimeout(function() {
      console.log(i); // Θα εμφανίσει 3, 3, 3 (i έχει την τελευταία τιμή του βρόχου)
    }, 100);
  }
}

παράδειγμαΒρόχουVar();

Λόγω αυτών των χαρακτηριστικών, συνιστάται η χρήση let ή const, που έχουν μπλοκ εμβέλεια, για την αποφυγή απρόβλεπτων καταστάσεων.