# O que é o “Hoisting”?

Continuando os escritos pontuais da linguagem JavaScript, hoje vou escrever sobre o “*Hoisting*”. 

Antes de continuar é importante avisar da necessidade de conhecer o conceito de escopos global e local. 

Na literatura é comum dizer que o *Hositing* é um processo no qual as declarações das variáveis e das funções são movidas para o topo do código durante o processo de compilação/interpretação. A imagem a seguir tentar mostrar como seria sob essa visão:


![Untitled.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1650803589222/FIahRzf4N.png)

Na verdade, não é bem assim que ocorre, trata-se apenas de uma maneira didática de compreender o processo. 

De acordo com o MDN, “*as declarações de variável e função são colocadas na memória durante a fase de compilação, mas permanecem exatamente onde você as digitou no seu código.*”.

Ou seja, todas as variáveis e funções com escopo global são alocadas na memória, sem que sejam retiradas das suas posições no código. 

É como se o compilador/interpretador mapeasse todas as declarações das funções e variáveis.

O levantamento como dizemos acima não ocorre, como disse, é uma maneira didática de compreender o processo. 

Impera salientar que ocorre apenas com as funções e variáveis com escopo global. Declarações com escopo local não sofrem o “*Hoisting*”. 

Vamos para um exemplo de código para ver suas implicações práticas:

```jsx
console.log(a) // undefined

var a = 1;

console.log(a) // 1
```

Veja que, apesar que a variável ‘a’ tenha sido declarada após o primeiro ‘console.log()’, o resultado na tela foi ‘*undefined*’, ou seja, para ela apenas não foi definido um valor. 

Outro exemplo com ‘*let*’:

```jsx
console.log(a) // ReferenceError: a is not defined

let a = 1;

console.log(a)
```

Agora quando declaramos a variável por meio do ‘*let*’ é retornado um erro de referência. É acusado que a variável não foi definida. 

Isso acontece em razão do escopo local de ‘*let*’, assim, não sofre o *Hoisting*.

Essa é a diferença, por meio do processo de *Hoisting*, mesmo que a declaração seja posterior, o  compilador/interpretador já a conhece, e apenas devolve que não foi inicializado nenhum valor para ela. 

Por outro lado, quando a declaração tem natureza de escopo local. A sua chamada antes da declaração devolve um erro de referência: acusa-se que a variável ou função não foi declarada.
