Da trilha de JavaScript Este conceito ainda não saiu como card do dia. ir para o card de hoje

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

  • var tem escopo de função; let e const têm escopo de bloco.
  • var é hoisted e inicializada com undefined; let e const entram na Temporal Dead Zone.
  • let permite reatribuição; const não permite reatribuir a referência.
  • Prefira const por padrão; use let só quando precisar reatribuir; evite var.
variaveis.js
// 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

Exercícios

  1. 1
    Fácil

    Corrija o escopo

    O código abaixo tenta imprimir mensagem fora do bloco if, mas ocorre um erro. Altere a declaração para que a variável seja acessível fora do bloco, mantendo o escopo de função.

    Resolver
  2. 2
    Médio

    Temporal Dead Zone na prática

    Explique e demonstre o comportamento da Temporal Dead Zone (TDZ) com let. Crie uma função que tenta acessar uma variável antes da declaração, capture o erro e imprima uma mensagem explicativa.

    Resolver
  3. 3
    Desafio

    Loop com closures: var vs let

    Crie uma função que retorna um array de funções. Cada função, ao ser chamada, deve imprimir seu índice (0, 1, 2). Use let no loop para obter o comportamento correto. Em seguida, mostre como var causaria um problema e como corrigi-lo com uma IIFE (Immediately Invoked Function Expression).

    Resolver

Continue estudando