43 lines
1.8 KiB
Plaintext
43 lines
1.8 KiB
Plaintext
---
|
|
title: 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.
|
|
|
|
```js
|
|
console.log(foo); // indefinido
|
|
var 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.
|
|
|
|
```js
|
|
// Declaração de função
|
|
console.log(foo); // [Function: foo]
|
|
foo(); // 'FOOOOO'
|
|
function foo() {
|
|
console.log('FOOOOO');
|
|
}
|
|
console.log(foo); // [Function: foo]
|
|
|
|
// Function Expression
|
|
console.log(bar); // undefined
|
|
bar(); // Uncaught TypeError: bar is not a function
|
|
var 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.
|
|
|
|
```js
|
|
x; // undefined; // Erro de referência: y não está definido
|
|
|
|
var x = 'local';
|
|
let y = 'local';
|
|
```
|