JavaScript Fundamentos Básico
let, const e var
Em JavaScript, existem três formas de declarar variáveis: var, let e const. Elas diferem principalmente em escopo, hoisting e reatribuição. Entender essas diferenças é fundamental para escrever código previsível e evitar bugs sutis.
var tem escopo de função (ou global) e sofre hoisting, sendo inicializada com undefined antes da declaração. Já let e const têm escopo de bloco, ou seja, só existem dentro do bloco { ... } onde foram declaradas. Além disso, let e const também sofrem hoisting, mas ficam na Temporal Dead Zone (TDZ): não podem ser acessadas antes da linha da declaração.
let permite reatribuição, enquanto const cria uma referência imutável (o valor em si pode ser mutável, se for um objeto). Hoje, a recomendação é usar const por padrão, let quando precisar reatribuir, e evitar var completamente.
Pontos-chave
vartem escopo de função;leteconsttêm escopo de bloco.varé hoisted e inicializada comundefined;leteconstentram na Temporal Dead Zone.letpermite reatribuição;constnão permite reatribuir a referência.- Prefira
constpor padrão; useletsó quando precisar reatribuir; evitevar.
// Exemplo prático das diferenças entre var, let e const
function exemploVar() {
if (true) {
var x = 10; // escopo de função
}
console.log('var x fora do bloco:', x); // 10
}
exemploVar();
function exemploLet() {
if (true) {
let y = 20; // escopo de bloco
console.log('let y dentro do bloco:', y); // 20
}
// console.log(y); // ReferenceError: y is not defined
}
exemploLet();
// Temporal Dead Zone (TDZ)
function tdz() {
// console.log(z); // ReferenceError: Cannot access 'z' before initialization
let z = 30;
console.log('let z após declaração:', z); // 30
}
tdz();
// const: referência imutável, mas objeto mutável
const pessoa = { nome: 'Ana' };
pessoa.nome = 'Maria'; // permitido: mutação do objeto
console.log('pessoa.nome:', pessoa.nome); // Maria
// pessoa = {}; // TypeError: Assignment to constant variable.
// var vs let em loops
for (var i = 0; i < 3; i++) {}
console.log('var i após loop:', i); // 3 (escopo de função)
for (let j = 0; j < 3; j++) {}
// console.log(j); // ReferenceError: j is not defined