Explique "hoisting"
Hoisting é um termo usado para explicar o comportamento de declarações variáveis em seu código. Variáveis declaradas ou inicializadas com a palavra-chave var
terão sua declaração "movida" até o topo do escopo do módulo/função do escopo, a que chamamos de hoisting. No entanto, apenas a declaração está hoisted, a atribuição (se houver uma), ficará onde está.
Observe que a declaração não é realmente movida - o motor de JavaScript analisa as declarações durante a compilação e torna-se ciente das declarações e dos seus âmbitos. É mais fácil compreender este comportamento, visualizando as declarações como sendo hoisted até ao topo do seu escopo. Vamos explicar com alguns exemplos.
console.log(foo); // indefinidovar foo = 1;console.log(foo); // 1
As declarações de função têm o corpo hoisted enquanto as expressões da função (escritas na forma de declarações variáveis) só tem a declaração da variável hoisted.
// Declaração de funçãoconsole.log(foo); // [Function: foo]foo(); // 'FOOOOO'function foo() {console.log('FOOOOO');}console.log(foo); // [Function: foo]// Function Expressionconsole.log(bar); // undefinedbar(); // Uncaught TypeError: bar is not a functionvar bar = function () {console.log('BARRRR');};console.log(bar); // [Function: bar]
Variáveis declaradas via let
e const
também sofrem o hoisted. No entanto, ao contrário de var
e function
, eles não são inicializados e acessá-los antes que a declaração resulte em uma exceção ReferenceError
. A variável está em uma "zona temporária morta" desde o início do bloco até que a declaração seja processada.
x; // undefined; // Erro de referência: y não está definidovar x = 'local';let y = 'local';