Var, let ou const, qual devo usar?

Capa do artigo


Quando falamos em Javascript é normal vir à cabeça algumas das peculiaridades da linguagem, e para iniciantes muitas coisas parecem tão bicho de sete cabeças, por exemplo as opções de declaração de variáveis.

No início eu também me perguntava o por quê de existir as palavras chave var, let e const para declaração de variáveis, como e quando usá-las.

Pois bem, vamos tentar entender os conceitos e usos, mas antes vamos falar do famoso hoisting.

Hoisting

Em Javascript todas as variáveis sofrem hoisting — são içadas/elevadas — ao topo do contexto de execução no qual elas estão.

Então por esse motivo é possível usar uma variável antes dela ter sido declarada — não confunda com usar sem declarar, isso daria erro —, pois em tempo de execução a variável sofrerá hoisting — será elevada — e tudo funcionará como esperado.

Conceito de hoisting entendido até agora, certo?

var

Esta é a forma mais antiga, mais utilizada e atualmente menos recomendada, porém a única que 100% dos browsers entende.

Declarações com var não ficam no escopo de bloco, mas sim de função, ou global como podemos ver a seguir:

À primeira vista e em pequenos projeto isso pode não parecer um problema, mas imagine um grande projeto onde precisa de uma varíavel apenas em um certo escopo, de bloco por exemplo. Quando a variável for içada teremos um problema, estaremos para sempre ocupando espaço em memória que só vai ser útil em uma parte do código.

Para resolver esse problema de escopo então, foi implementada a keyword let. Vamos revisar usando a mesma ideia do código anterior:

Opa, agora se rodarmos o código teremos um erro similar a:

Uncaught SyntaxError: Identifier 'test' has already been declared at line 16 col 5

Opa, aqui diz que a variável test a qual tentamos declarar na linha 16 já existe, então vamos só tirar o let da linha 16.

Agora temos outro erro, dessa vez do tipo:

Uncaught ReferenceError: stringTest is not defined at line 3 col 15

Este erro diz que a variável chamada na linha 3 não foi definida.

Vamos comentar a linha 3 e agora temos o mesmo erro, mas na linha 11 a qual também vamos comentar.

Ok, vimos que fora do escopo de if(){} a varível stringTest sempre dá erro de referência.

Beleza, problema de escopo resolvido. Agora a variável só existe no escopo onde foi definida, e morre no final dele.

Mas dependendo do que queremos fazer ainda temos um problema, o valor da variável continua sendo sobrescrito na linha 16, pensando nisso também, foi implementado a const.

Com ela declaramos uma variável cujo valor/tipo nunca pode ser alterado programaticamente e também segue o conceito de escopo como a let como podemos ver no exemplo a seguir

Ao rodar teremos um erro de referência similar a:

Uncaught ReferenceError: stringTest is not defined at line 7 col 15

Vamos comentar a linha 7 e ver o erro mudar para um TypeError na linha 12. Isso quer dizer que agora não podemos sobrescrever a variável — agora constante — test.

JS é mesmo ótimo, não?

Quando devo usar cada um?

Isso depende do seu projeto porém em todo caso onde a variável pode sofrer alteração, é aconselhável o uso de let.

Se precisa que um valor sempre se mantenha, use a const.

Se precisar de alta compatibilidade entre browsers mais antigos, a var.

Ok, espero que até aqui esteja tudo entendido.

Um abraço e até a próxima.
Caso tenha dúvidas, pode colocar nos comentários.


Leituras recomendadas

Comentários

Postagens mais visitadas deste blog

Criando uma aplicação gráfica Python com TKinter

POO, o que é? É realmente tão difícil?

Baixando vídeo do YouTube com Python