Hoisting

É 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ÃO
Nã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.
OBS:
Diferença entre variável e função, é que a função é içada como um todo.
Boa Prática:
Sempre declarar antes da execução.
Dica:
Para descobrir o contexto de uma função, basta olhar para o lado esquerdo, quem está executando, esse é o contexto de execução.