Variáveis JavaScript
Artigo do W3Docs sobre variáveis JavaScript: declaração, uso de var, let e const, escopo e a Zona Morta Temporal (TDZ).
Introdução
Uma variável é um contêiner nomeado para um valor. Em JavaScript você cria variáveis para armazenar dados — o nome de um utilizador, um total acumulado, o resultado de um cálculo — e depois referencia esses dados pelo nome em outra parte do programa.
Este guia cobre tudo o que você precisa para declarar variáveis com confiança: as três palavras-chave (let, const e o mais antigo var), como o escopo determina onde uma variável é visível, o que são hoisting e a Zona Morta Temporal (TDZ) na prática, a diferença entre reatribuir e mutar um const, e as regras de nomeação e convenções seguidas pela comunidade.
Versão curta: use const por padrão, let quando precisar reatribuir, e evite var em código moderno.
Declarando uma Variável
Você declara uma variável com uma palavra-chave seguida de um nome e, opcionalmente, atribui um valor com =:
JavaScript é dinamicamente tipado: uma variável não tem um tipo fixo, portanto a mesma variável pode conter uma string agora e um número depois. (Veja Tipos de Dados JavaScript para os valores que variáveis podem armazenar.)
Existem três palavras-chave de declaração:
const— para valores que não serão reatribuídos (sua escolha padrão).let— para valores que serão reatribuídos.var— a palavra-chave original, mantida por compatibilidade retroativa. Veja O antigo "var".
let, const e var Comparados
| Palavra-chave | Escopo | Reatribuir? | Redeclarar no mesmo escopo? | Hoisting |
|---|---|---|---|---|
const | bloco | Não | Não | TDZ |
let | bloco | Sim | Não | TDZ |
var | função | Sim | Sim | Hoisted, inicializado como undefined |
O exemplo abaixo mostra as diferenças práticas entre let/const com escopo de bloco e var com escopo de função:
Escopo: Onde Vive uma Variável
O escopo determina onde no seu código uma variável pode ser acessada. Para um tratamento mais aprofundado, veja Escopo de variáveis, closure.
Escopo de Bloco (let e const)
let e const são visíveis apenas dentro do bloco { ... } onde são declarados — um if, um loop ou qualquer par de chaves:
É por isso que let é a escolha certa para contadores de loop: cada iteração de um loop for tem sua própria vinculação.
Escopo de Função (var)
var ignora blocos. Seu escopo é a função envolvente mais próxima (ou o escopo global se estiver fora de qualquer função), o que é uma fonte comum de bugs:
Escopo Global
Uma variável declarada fora de qualquer função é global e acessível em todo lugar. Nos navegadores, um var no nível superior se anexa ao objeto global window, enquanto let e const no nível superior têm escopo de script e não o fazem:
Hoisting e a Zona Morta Temporal
Hoisting significa que as declarações são processadas antes que o código seja executado. As três palavras-chave diferem em como realizam o hoisting.
Uma declaração var é içada e inicializada como undefined, então lê-la antes da linha que a atribui retorna undefined em vez de um erro:
let e const também são içados, mas não são inicializados. Desde o início do bloco até a linha de declaração, a variável fica na Zona Morta Temporal (TDZ) — acessá-la lança um ReferenceError:
A TDZ é um recurso, não uma quirk: ela captura o uso acidental antes da declaração que o var esconde silenciosamente.
const: Reatribuição vs. Mutação
const impede a reatribuição da variável — você não pode apontar o nome para um novo valor. Ele não torna o valor em si imutável. Objects e arrays mantidos em um const ainda podem ser alterados:
Use const para objects e arrays sempre que não reatribuir a vinculação — isso documenta a intenção e previne toda uma classe de bugs. Se você realmente precisar de um object imutável, use Object.freeze().
Regras e Convenções de Nomeação
JavaScript impõe algumas regras rígidas para nomes de variáveis:
- Os nomes podem conter letras, dígitos,
_(sublinhado) e$(cifrão). - Os nomes não devem começar com um dígito.
- Os nomes são sensíveis a maiúsculas e minúsculas —
totaleTotalsão variáveis diferentes. - Palavras-chave reservadas como
let,classoureturnnão podem ser usadas. - Espaços não são permitidos.
Além das regras, siga estas convenções para um código legível:
- Use nomes descritivos:
userAge, nãox. - Use camelCase para variáveis e funções:
firstName,itemCount. - Use UPPER_SNAKE_CASE para constantes fixas:
const MAX_SIZE = 100;. - Evite letras únicas, exceto para contadores de loop de curta duração (
i,j).
Resumo
- Use
constpor padrão,letquando precisar reatribuir, e evitevarem código novo. leteconsttêm escopo de bloco;vartem escopo de função e vaza para fora dos blocos.let/constficam na TDZ antes de sua declaração;varé lido comoundefined.constbloqueia a reatribuição, não a mutação — o conteúdo de objects e arrays ainda pode mudar.- Siga as regras de nomeação (sem dígito inicial, sem palavras-chave, sensível a maiúsculas) e use camelCase.
Para aprofundar, leia O antigo "var" e Escopo de variáveis, closure.