O que é Hoisting?

Hoisting é um comportamento em JavaScript que frequentemente confunde iniciantes, mas entendê-lo pode ajudar você a evitar bugs sutis no seu código. Em termos simples, hoisting é o comportamento padrão do JavaScript de mover declarações para o topo de seus respectivos escopos durante a fase de compilação antes que o código seja executado. Para entender hoisting, é importante saber que o JavaScript é executado em duas fases: a fase de compilação e a fase de execução. Durante a fase de compilação, o motor JavaScript percorre seu código e configura espaço de memória para variáveis e funções. É aqui que o hoisting entra em cena. Vamos começar com o hoisting de variáveis, quando você declara uma variável usando a palavra-chave var, o JavaScript eleva a declaração para o topo do seu escopo. No entanto, é crucial notar que apenas a declaração é hoisted, não a inicialização. Isso significa que você pode usar uma variável no seu código antes de declará-la, mas seu valor será undefined até que você realmente atribua um valor a ela.
console.log(x); // undefined
var x = 5;
console.log(x); // 5
Neste código, mesmo que usemos x antes de declará-lo, não recebemos um erro, em vez disso recebemos undefined. Isso acontece porque o JavaScript eleva a declaração var x para o topo do seu escopo mas não a inicialização x = 5. É como se o código fosse reescrito assim:
var x;
console.log(x); // undefined
x = 5;
console.log(x); // 5
A elevação de função funciona de forma um pouco diferente. Quando você declara uma função usando a sintaxe de declaração function tanto o nome da função quanto o corpo da função são içados. Isso significa que você pode chamar uma função antes de declará-la no seu código. Aqui está um exemplo de hoisting de função:
sayHello(); // "Hello, World!"

function sayHello(){
  console.log("Hello, World!");
}
Neste caso, podemos chamar sayHello() antes da sua declaração porque toda a função é içada para o topo do seu escopo. É importante notar que o hoisting funciona de forma diferente com as declarações let e const introduzidas no ES6.
console.log(y); // Throws a ReferenceError
let y = 10;
Essas declarações são elevadas, mas não são inicializadas e você não pode acessá-las antes da declaração real no seu código. Isso é frequentemente referido como a zona morta temporal. Entender hoisting pode ajudar você a escrever código mais limpo e previsível. No entanto, depender de hoisting pode tornar seu código mais difícil de ler e manter. Como uma boa prática, recomenda-se declarar suas variáveis no topo do seu escopo e suas funções antes de usá-las independentemente de hoisting. This make your code's behavior more explicit and easier for others including your future self to understand.
Este módulo não possui perguntas. Marque como concluído.