DEV Community

Plínio Ribeiro
Plínio Ribeiro

Posted on

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:

Image description

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:

console.log(a) // undefined

var a = 1;

console.log(a) // 1
Enter fullscreen mode Exit fullscreen mode

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’:

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

let a = 1;

console.log(a)
Enter fullscreen mode Exit fullscreen mode

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.

Top comments (0)