aboutsummaryrefslogtreecommitdiff
path: root/files/el/glossary/hoisting/index.html
blob: c777c4cb002156f21dcfc4de7f5f0d1531f42b58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
---
title: Hoisting
slug: Glossary/Hoisting
translation_of: Glossary/Hoisting
---
<p>Η ανύψωση(Hoisting) είναι ένας όρος που <em>δεν</em> χρησιμοποιείται σε καμία γραπτή κανονιστική προδιαγραφή πριν από την <a href="http://www.ecma-international.org/ecma-262/6.0/index.html">ECMAScript® 2015 Language Specification</a>. Η ανύψωση εφευρέθηκε σαν μια γενική έννοια που περιγράφει το πως δουλεύει το περιβάλλον εκτέλεσης στην JavaScript (ειδικά οι φάσεις της δημιουργίας και της εκτέλεσης) . Αλλά, στην πράξη η έννοια αυτή οδηγεί σε παρεξηγήσεις. Για παράδειγμα, η ανύψωση περιγράφει ότι οι δηλώσεις των μεταβλητών και των μεθόδων μετακινούνται "φυσικά" στην κορυφή του κώδικά, αλλά κάτι τέτοιο δεν συμβαίνει καθόλου. Αυτό που πρακτικά συμβαίνει είναι ότι οι δηλώσεις των μεταβλητών και των μεθόδων τοποθετούνται στην μνήμη κατά τη διάρκεια της φάσης της <u>μεταγλώττισης</u>, αλλά μένουν ακριβώς εκεί όπου δηλώθηκαν μέσα στον κώδικα.</p>

<h2 id="Μάθε_περισσότερα">Μάθε περισσότερα</h2>

<h3 id="Τεχνικό_παράδειγμα">Τεχνικό παράδειγμα</h3>

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

<pre class="brush: js">function catName(name) {
  console.log("My cat's name is " + name);
}

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

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

<pre class="brush: js">catName("Chloe");

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

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

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

<h3 id="Τεχνικό_παράδειγμα_2">Τεχνικό παράδειγμα</h3>

<pre class="brush: js">num = 6;
num + 7;
var num;
/* δεν δίνει λάθος εφ' όσον η μεταβλητή num είναι δηλωμένη */

</pre>

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

<pre class="brush: js">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
</pre>

<h3 id="Τεχνικές_αναφορές">Τεχνικές αναφορές</h3>

<ul>
 <li><a href="https://www.udemy.com/understand-javascript/">JavaScript: Understanding the Weird Parts</a> - Udemy.com Course</li>
 <li><a href="/en-US/docs/Web/JavaScript/Reference/Statements/var">var statement</a> - MDN</li>
 <li><a href="/en-US/docs/Web/JavaScript/Reference/Statements/function">function statement</a> - MDN</li>
</ul>