--- title: Hoisting slug: Glossary/Hoisting translation_of: Glossary/Hoisting ---

Η ανύψωση(Hoisting) είναι ένας όρος που δεν χρησιμοποιείται σε καμία γραπτή κανονιστική προδιαγραφή πριν από την ECMAScript® 2015 Language Specification. Η ανύψωση εφευρέθηκε σαν μια γενική έννοια που περιγράφει το πως δουλεύει το περιβάλλον εκτέλεσης στην JavaScript (ειδικά οι φάσεις της δημιουργίας και της εκτέλεσης) . Αλλά, στην πράξη η έννοια αυτή οδηγεί σε παρεξηγήσεις. Για παράδειγμα, η ανύψωση περιγράφει ότι οι δηλώσεις των μεταβλητών και των μεθόδων μετακινούνται "φυσικά" στην κορυφή του κώδικά, αλλά κάτι τέτοιο δεν συμβαίνει καθόλου. Αυτό που πρακτικά συμβαίνει είναι ότι οι δηλώσεις των μεταβλητών και των μεθόδων τοποθετούνται στην μνήμη κατά τη διάρκεια της φάσης της μεταγλώττισης, αλλά μένουν ακριβώς εκεί όπου δηλώθηκαν μέσα στον κώδικα.

Μάθε περισσότερα

Τεχνικό παράδειγμα

Ένα από τα πλεονεκτήματα του να τοποθετεί η JavaScript τις δηλώσεις των μεθόδων στη μνήμη πριν να εκτελέσει οποιοδήποτε κωμάτι κώδικα είναι ότι έτσι σου επιτρέπει να χρησιμοποιήσεις τη μέθοδο πριν να την δηλώσεις στον κώδικά σου. Για παράδειγμα:

function catName(name) {
  console.log("My cat's name is " + name);
}

catName("Tigger");
/*
Το αποτέλεσμα του παραπάνω κώδικα είναι: "My cat's name is Tigger"
*/

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

catName("Chloe");

function catName(name) {
  console.log("My cat's name is " + name);
}
/*
Το αποτέλεσμα του παραπάνω κώδικα είναι: "My cat's name is Chloe"
*/

Ενώ στον κώδικά μας πρώτα καλούμε την μέθοδο, προτού δηλωθεί η μέθοδος, ο κώδικας εξακολουθεί να δουλεύει. Αυτό συμβαίνει εξ αιτίας του τρόπου που δουλεύει το περιβάλλον εκτέλεσης στην JavaScript.

Η ανύψωση δουλεύει επίσης καλά και με άλλους τύπους δεδομένων και μεταβλητών. Οι μεταβλητές μπορούν να αρχικοποιούνται και να χρησιμοποιούνται πριν δηλωθούν. Αλλά δεν μπορούν να χρησιμοποιηθούν χωρίς να έχουν αρχικοποιηθεί.

Τεχνικό παράδειγμα

num = 6;
num + 7;
var num;
/* δεν δίνει λάθος εφ' όσον η μεταβλητή num είναι δηλωμένη */

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

var x = 1; // Initialize x
console.log(x + " " + y); // '1 undefined'
var y = 2;


// Ο παρακάτω κώδικας θα συμπεριφερθεί το ίδιο όπως και ο προηγούμενος κώδικας:
var x = 1; // Initialize x
var y; // Declare y
console.log(x + " " + y); // '1 undefined'
y = 2; // Initialize y

Τεχνικές αναφορές