Elevação de JavaScript


Índice

    Mostrar índice


Hoisting é o comportamento padrão do JavaScript de mover declarações para o principal.


Declarações JavaScript são içadas

Em JavaScript, uma variável pode ser declarada após ter sido usada.

Em outras palavras; uma variável pode ser usada antes de ser declarada.

O Exemplo 1 fornece o mesmo resultado que o Exemplo 2:

Exemplo 1

x = 5; // Assign 5 to x

elem = document.getElementById("demo"); // Find an element 
elem.innerHTML = x;                     
// Display x in the element
var x; // Declare x

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
x = 5; // Assign 5 to x

elem = document.getElementById("demo"); // Find an element 
elem.innerHTML = x;           // Display x in the element

var x; // Declare x
</script>

</body>
</html> 

Exemplo 2

var x; // Declare x
x = 5; // Assign 5 to x

elem = document.getElementById("demo"); // Find an element 
elem.innerHTML = x;                     
// Display x in the element

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var x; // Declare x
x = 5; // Assign 5 to x

elem = document.getElementById("demo"); // Find an element 
elem.innerHTML = x;           // Display x in the element
</script>

</body>
</html> 

Para entender isso, é preciso entender o termo “içamento”.

Hoisting é o comportamento padrão do JavaScript de mover todas as declarações para o topo do escopo atual (no topo do script atual ou da função atual).


As palavras-chave let e const

Variáveis definidas com let e const são içadas para o topo do bloco, mas não inicializado.<p>Significado: o bloco de código está ciente do variável, mas não pode ser usada até que seja declarada. <p>Usar uma variável let antes de ser declarada resultará em um ReferenceError.

A variável está em uma "zona morta temporal" desde o início do bloco até que seja declarado:

Exemplo

carName = "Volvo";
let carName;

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript Hoisting</h2>
<p>With <b>let</b>, you cannot use a variable before it is declared.</p>
<p id="demo"></p>

<script>
try {
  carName = "Saab";
  let carName = "Volvo";
}
catch(err) {
  document.getElementById("demo").innerHTML = err;
}
</script>

</body>
</html>

Usar uma variável const antes de ser declarada é um erro de sintaxe, então o código simplesmente não será executado.

Exemplo

Este código não será executado.

carName = "Volvo";
const carName;

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript Hoisting</h2>

<p>With <b>const</b>, you cannot use a variable before it is declared.</p>
<p>Try to remove the //.</p>

<p id="demo"></p>

<script>
carName = "Volvo";
//const carName;
document.getElementById("demo").innerHTML = carName;
</script>

</body>
</html>

Leia mais sobre let e const em JS Let/Const.



As inicializações de JavaScript não são içadas

JavaScript apenas eleva declarações, não inicializações.

O Exemplo 1 não fornece o mesmo resultado que Exemplo 2:

Exemplo 1

var x = 5; // Initialize x
var y = 7; // Initialize y
elem = document.getElementById("demo"); // Find an element 
elem.innerHTML = x + " " + y;           // Display x and y

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var x = 5; // Initialize x
var y = 7; // Initialize y

elem = document.getElementById("demo"); // Find an element 
elem.innerHTML = x + " " + y;       // Display x and y

</script>

</body>
</html> 

Exemplo 2

var x = 5; // Initialize x

elem = document.getElementById("demo"); // Find an element 
elem.innerHTML = x + " " + y;           // Display x and y

var y = 7; // Initialize y

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var x = 5;  // Initialize x

elem = document.getElementById("demo");      // Find an element 
elem.innerHTML = "x is " + x + " and y is " + y;  // Display x and y

var y = 7;  // Initialize y
</script>

</body>
</html> 

Faz sentido que y seja indefinido no último exemplo?

Isso ocorre porque apenas a declaração (var y), e não a inicialização (=7), é elevada ao topo.

Por causa do içamento, y foi declarado antes de ser usado, mas porque as inicializações não são içadas, o valor de y é indefinido.

O exemplo 2 é o mesmo que escrever:

Exemplo

var x = 5; // Initialize x
var y;     // Declare y

elem = document.getElementById("demo"); // Find an element 
elem.innerHTML = x + " " + y;           // Display x and y

y = 7;    // Assign 7 to y 

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var x = 5; // Initialize x
var y;   // Declare y

elem = document.getElementById("demo"); // Find an element 
elem.innerHTML = x + " " + y;       // Display x and y

y = 7;   // Assign 7 to y

</script>

</body>
</html> 

Declare suas variáveis no topo!

Içar é (para muitos desenvolvedores) um comportamento desconhecido ou negligenciado de JavaScript.

Se um desenvolvedor não entender o içamento, os programas poderão conter bugs (erros).<p> Para evitar bugs, sempre declare todas as variáveis no início de cada escopo.<p> Como é assim que o JavaScript interpreta o código, é sempre uma boa regra.

JavaScript em modo estrito não permite o uso de variáveis se forem não declarado.
Estude "use strict" no próximo capítulo.