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, που έχουν μπλοκ εμβέλεια, για την αποφυγή απρόβλεπτων καταστάσεων.