--- title: Hoisting slug: Glossary/Hoisting tags: - Glossário - JavaScript translation_of: Glossary/Hoisting ---
Hoisting (sollevare, issare in italiano) è un termine che non sentirai mai usare in nessuno testo normativo prima di ECMAScript® 2015 Language Specification. L'Hoisting è stato pensato come un modo generico di pensare a come funziona, in Javascript, il contesto di esecuzione (nello specifico le fasi di creazioni e di esecuzione). Il concetto può essere poco chiaro all'inizio.
Una definizione rigida di Hoisting potrebbe essere: "(durante la fase di compilazione) le dichiarazioni delle variabili e delle funzioni sono fisicamente spostate in cima al codice", ma questo di fatto non è quello che succede. In realtà, le dichiarazioni delle variabili e delle funzioni sono messe in memoria durante la fase di compilazione, ma rimangono esattamente dove le hai scritte nel codice.
Uno dei vantaggi di mettere in memoria la dichiarazione delle funzioni, prima di eseguire qualunque segmento di codice, è che questo ti permette di usare una funzione prima di dichiararla. Per esempio:
function catName(name) { console.log("My cat's name is " + name); } catName("Tigger"); /* Il risultato del codice sopra è: "My cat's name is Tigger" */
Il codice sopra è scritto come chiunque si aspetterebbe. Ora, vediamo cosa succede quando chiamiamo la funzione prima di scriverla:
catName("Chloe"); function catName(name) { console.log("My cat's name is " + name); } /* Il risultato del codice sopra è: "My cat's name is Chloe" */
Anche se chiamiamo la funzione all'inizio del codice, prima che questa sia scritta, il codice continua a funzionare. Questo accade grazie al comportamento del "contesto di esecuzione" (execution context) di Javascript.
L'Hoisting funziona bene anche con altri tipi di dati (data types) e con le variabili. Le variabili possono essere inizializzate e usate prima di essere dichiarate. Ma non possono essere usate senza inizializzazione.
num = 6; num + 7; var num; /* non restituisce errore perchè num è dichiarata*/
Javascript "solleva" (hoists) solo le dichiarazioni, non le inizializzazioni. Se utilizzi una variabile prima di dichiararla e inizializzarla, il suo valore sarà undefined. L'esempio qui sotto dimostra questo comportamento.
var x = 1; // Initialize x console.log(x + " " + y); // '1 undefined' var y = 2; // Initialize y // Il codice seguente si comporterà nella stessa maniera del precedente var x = 1; // Initialize x var y; // Declare y console.log(x + " " + y); // '1 undefined' y = 2; // Initialize y