É o processo de levantar ou suspender algo.
Este comportamento ocorre na declaração de variáveis e funções,
onde são elevadas ao topo do escopo em que estão.
Escopo de Bloco
Faz Hoisting: NÃONão é permitido que uma variável ou função seja executada antes de ser declarada. Fica acessível somente dentro do bloco onde foi declarada. Variável Não pode ser redefinida/redeclarada.
let name = 'Maria';
let name = 'João';
Uncaught SyntaxError: Identifier 'name' has already been declared.
Escopo Global
Faz Hoisting: SIMÉ permitido que que uma variável ou função seja executada antes de ser declarada, porque nestes casos, a variável ou função é promovida ao topo do escopo. Variável pode ser redefinida/redeclarada. Fica acessível globalmente através do objeto window.
var test = 'test';
window.test = 'Alterando variavel global via objeto window';
console.log(test);
Hoisting de variáveis
Eleva apenas a criação da variável e não a sua atribuição.Em outras linguagens gera "ReferenceError", mas no JS gera "undefinied" porque o tipo é conhecido na atribuição e não na criação.
num1 = 1;
console.log(++num1);
var num1; // Hoisting
Hoisting de funções
Elevada ao topo como um todo, até a assinatura da função.O this neste caso, faz referência a quem está executando.
Geralmente funções de timer, callback, request, eventlistener são executadas em um contexto global.
As funções regulares possuem os métodos bind() e apply() que podem ser usados para fixar o contexto de criação passando o this como parâmetro, independente da execução (Existem pequenas diferenças entre eles **Pesquisar**).
Outra forma de ter acesso ao contexto de criação é ficar criando uma variavel para armazenar o contexto.