Quando usar const, let e var ? JavaScript ES6+

Julio Sampaio
skillo.io
Published in
6 min readSep 15, 2017

Se você chegou até aqui ao pesquisar a frase do título deste post, é sinal de que você quer uma resposta imediata, portanto a resposta que você procura é a seguinte:

const: utilize quando você precisar declarar constantes, ou seja, você não quer haja uma nova atribuição de valor para uma variável durante a execução do bloco. O escopo das variáveis declaradas com const será o bloco em que elas foram declaradas.

let: utilize quando você precisar fazer reatribuições, ou seja, a sua variável precisará assumir diferentes valores durante a execução do bloco. Assim como const, o escopo das variáveis definidas com let será o bloco em que foram declaradas.

var: utilize quando precisar declarar uma variável que deve ser global dentro do seu contexto de execução, ou seja, o valor dessa variável poderá ser alterado a qualquer momento em qualquer bloco que esteja dentro do mesmo contexto de execução. Dito isto, o escopo dos identificadores definidos com var é o contexto de execução em que foram declarados, se a variável foi declarada dentro de uma função, seu escopo será aquela função, se não foi declarado dentro de nenhuma função, seu escopo será global.

Se você se identificou com o primeiro parágrafo do texto e só queria um resumo, antes de ir, talvez você se interesse em saber mais detalhes sobre este assunto, por favor me acompanhe pelos próximos parágrafos. Eles estão cheios de informações interessantes!

Mais detalhes sobre ‘const’

Diferente de var e let, sempre que definirmos uma variável com const obrigatoriamente devemos inicializá-la (o que realmente faz sentido já que não queremos que este valor seja alterado posteriormente). Veja que é gerado um erro de sintaxe quando não inicializamos uma const:

Uma vez inicializado, não é possível atribuir um novo valor à variável declarada com const. Caso isso aconteça, durante a execução do código, será gerado um TypeError informando esta condição de erro:

Apesar da referência criada com const ser somente leitura, isso não significa que este valor é imutável. Por exemplo, caso o valor contido no identificador seja um objeto, as propriedades desse objeto podem ser alteradas normalmente. O que o const realmente impede é a reatribuição de valor ao identificador. Veja no exemplo abaixo:

No código acima, foi possível alterar normalmente a propriedade valor da variável obj (seu valor foi alterado de 1 para 3 ), já quando tentamos atribuir um novo valor diretamente para obj um erro é gerado.

Um pouco mais sobre ‘let’

Talvez você pense o seguinte:

— var para variável, faz sentido! const para constantes, também faz! Mas e o let, por que let?

Bom, para não perder o sentido semântico da expressão usada para criar variáveis (que outra palavra poderia-se usar para definir uma variável visto que o var já está sendo utilizado?)! Eu sei que em português fica meio sem sentido traduzindo ao pé da letra “deixe”, mas em inglês faz todo sentido! Vou te explicar: A palavra let é muito utilizada no meio matemático quando se está lendo atribuições de valores, por exemplo:

x = 10 // lê-se em Inglês: let x be 10;

Portanto, faz todo sentido no contexto do idioma já que os statements da linguagem são escritos em inglês. Isso aumenta muito a legibilidade, pois o let tem um sentido similar ao do var e permite que os comandos sejam lidos em linguagem natural:

let myPet = “dog”; // em Inglês: let my pet be a dog

Como vimos no início do artigo, o escopo das variáveis definidas com o let é o bloco no qual elas são definidas, mas são visíveis também em qualquer bloco filho:

O bloco do segundo if é um bloco filho e possui acesso à variável x

O oposto não é verdadeiro, ou seja, variáveis definidas com let não são visíveis aos blocos externos:

Note que no exemplo acima a variável yfoi definida dentro do bloco filho e está sendo utilizada fora deste bloco, esta é a razão do erro gerado: y is not defined.

Com o let também é possível definir variáveis com o mesmo nome sem que estas variáveis tenham seus valores sobrescritos dentro de seus contextos (desde que estas não sejam definidas no mesmo bloco):

Veja que no exemplo acima x só é 21 no escopo do segundo if, fora deste bloco o valor de x continua sendo 10. Pessoalmente, vejo poucas situações em que se justificaria utilizar essa possibilidade da linguagem, antes de tudo devemos prezar pela legibilidade e simplicidade do código.

Uma outra observação importante é que, diferente de var, o let não criará propriedades no objeto global quando utilizado fora de funções, ou seja, no contexto global. Veja um exemplo:

Note que o valor de y é undefined quando tentamos acessá-lo pelo objeto global

E o velho conhecido var

Como já sabemos, em JavaScript usamos o var para criar uma nova variável. Variáveis definidas com var, terão escopo definido pelo contexto de execução onde foram criadas, o que quer dizer que se a variável tiver sido declarada dentro de uma função essa função será seu escopo, se tiver sido declarada no contexto de execução global, esta variável será global.

É possível ainda, declarar variáveis sem utilizar qualquer palavra reservada, você pode simplesmente criar um identificador e passar a usá-lo normalmente, o efeito colateral disso é que essa variável se tornará uma propriedade do objeto global:

Veja que no exemplo acima definimos duas variáveis, a variável nome sem o uso do var, e variável sobrenome utilizando o var. Ao executar a função ola() vemos o retorno da concatenação e “por debaixo dos panos” o efeito colateral de definirmos a variável sem o var foi aplicado. Comprovamos isso ao executar this.nomeno contexto de execução global, ou seja, uma propriedade foi criada no objeto global apesar da variável nome ter sido declarada dentro da função ola().

Observe que esse comportamento não acontece quando executamos this.sobrenome porque declaramos esta variável utilizando a palavra var, isto restringiu o escopo de sobrenone à função ola(), por isto recebemos o valor undefined.

E concluindo …

Particularmente, utilizando ES6, não vejo mais a necessidade de se utilizar o var como padrão para declaração de variáveis, pois raras são as ocasiões em que desejamos que uma variável seja realmente global. Portanto, dou preferência ao uso de let e const, utilizando os critérios que vimos no início do artigo.

É… parece que é bye-bye var. E você, o que acha? Compartilhe conosco deixando sua opinião nos comentários!

--

--