Hoisting não é só uma palavra legal, é também uma característica muito importante da linguagem JavaScript, e é fundamental conhecê-lo para se entender melhor sobre funções e escopos.
Este é o primeiro vídeo da série onde discutiremos sobre hoisting e como ele pode afetar no seu desenvolvimento.

A palavra Hoisting significa “içar”, ou “elevar”, e a funcionalidade no código é bem essa mesma!

Veja, quando a engine JavaScript passa a interpretar e pré-compilar nosso código, a primeira coisa que ela faz é varrer nosso código a procura de certos tokens de construção.
Esta é a etapa chamada de TOKENIZAÇÃO.
Erros encontrados nesse momento são os chamados “erros léxicos”, são equivalentes a levantar uma bandeira vermelha e gritar “para tudo” que tem coisa errada aqui, e teu código não será executado.

É justamente neste momento que o hoisting acontece. A engine identifica tokens que alocam espaços na memória, como definição de uma variável ou de uma função.
A engine então “iça” esta definição, reservando com carinho um espaço na memória.

Mas vale citar aqui que, ao alocar o espaço de memória para uma variável, este espaço ficar reservado, porém vazio, ou seja, o valor deste espaço é undefined.

Depois que a engine termina o processo de “tokenizar” o teu código, entra o PARSER.
Ele vai passar por todo teu código, linha a linha, vai analisar as instruções e construir a AST, ou Abstract Syntax Tree.

Ainda existem dois novos passos nessa etapa, em um, o código é de certa forma “compilado” em um bytecode por um interpretador. E é aí que tuas instruções lógicas passam a coordenar o fluxo, também.
Isso tudo acontece em uma máquina virtual temporária, criada exclusivamente para interpretar o teu código…te faz se sentir especial ou não?

O outro passo, é implementado diferentemente em cada motor JavaScript, e é onde eles tentam optimizar a execução do código por meio de JITs, cache de instruções, remoção de espaços vazios ou códigos redundantes, etc.

Erros ocorridos durante o trabalho do parser, são os erros de sintaxe.

É durante este momento que aqueles espaços de memória reservados à variáveis poderão (ou não) receber um valor.

Nos vemos no próximo artigo/episódio!