Var, Let e Const - Qual é a diferença?
Muitos recursos novos e brilhantes foram lançados com o ES2015 (ES6). E agora, desde 2020, presume-se que muitos desenvolvedores de JavaScript se familiarizaram e começaram a usar esses recursos.
Embora essa suposição possa ser parcialmente verdadeira, ainda é possível que alguns desses recursos permaneçam um mistério para alguns desenvolvedores.
Um dos recursos que acompanham o ES6 é a adição de let
e const
, que pode ser usado para declaração de variável. A questão é: o que os torna diferentes do bom e velho var
que temos usado? Se ainda não tiver certeza sobre isso, este artigo é para você.
Neste artigo, vamos discutir var
, let
e const
no que diz respeito ao seu âmbito, uso e elevação. Ao ler, observe as diferenças entre eles que irei apontar.
Var
Antes do advento do ES6, as var
declarações prevaleciam. No var
entanto, existem problemas associados às variáveis declaradas com . É por isso que foi necessário o surgimento de novas maneiras de declarar variáveis. Primeiro, vamos entender var
melhor antes de discutir essas questões.
Escopo de var
Escopo significa essencialmente onde essas variáveis estão disponíveis para uso. var
as declarações têm escopo global ou função / escopo local.
O escopo é global quando uma var
variável é declarada fora de uma função. Isso significa que qualquer variável declarada var
fora de um bloco de função está disponível para uso em toda a janela.
var
tem escopo de função quando é declarada dentro de uma função. Isso significa que ele está disponível e pode ser acessado apenas nessa função.
Para entender melhor, veja o exemplo abaixo.
var greeter = "hey hi"; function newFunction() { var hello = "hello"; }
Aqui, o greeter
escopo é global porque existe fora de uma função enquanto o hello
escopo é da função. Portanto, não podemos acessar a variável hello
fora de uma função. Então, se fizermos isso:
var tester = "hey hi"; function newFunction() { var hello = "hello"; } console.log(hello); // error: hello is not defined
Obteremos um erro que é o resultado de hello
não estar disponível fora da função.
variáveis var podem ser declaradas novamente e atualizadas
Isso significa que podemos fazer isso dentro do mesmo escopo e não obteremos um erro.
var greeter = "hey hi"; var greeter = "say Hello instead";
e isso também
var greeter = "hey hi"; greeter = "say Hello instead";
Içamento de var
Hoisting é um mecanismo JavaScript onde as variáveis e declarações de função são movidas para o topo de seu escopo antes da execução do código. Isso significa que se fizermos isso:
console.log (greeter); var greeter = "say hello"
é interpretado assim:
var greeter; console.log(greeter); // greeter is undefined greeter = "say hello"
Portanto, as var
variáveis são içadas ao topo de seu escopo e inicializadas com um valor de undefined
.
Problema com var
Há uma fraqueza que vem com var
. Vou usar o exemplo abaixo para explicar:
var greeter = "hey hi"; var times = 4; if (times > 3) { var greeter = "say Hello instead"; } console.log(greeter) // "say Hello instead"
Portanto, uma vez que times > 3
retorna verdadeiro, greeter
é redefinido como "say Hello instead"
. Embora isso não seja um problema se você intencionalmente deseja greeter
ser redefinido, torna-se um problema quando você não percebe que uma variável greeter
já foi definida antes.
Se você tiver usado greeter
em outras partes do seu código, poderá se surpreender com a saída que poderá obter. Isso provavelmente causará muitos bugs em seu código. É por isso let
e const
são necessários.
Deixei
let
agora é preferido para declaração de variável. Não é nenhuma surpresa, pois isso representa uma melhoria nas var
declarações. Ele também resolve o problema var
que acabamos de ver. Vamos considerar por que isso acontece.
vamos bloquear o escopo
Um bloco é um pedaço de código limitado por {}. Um bloco vive entre chaves. Qualquer coisa entre chaves é um bloco.
Portanto, uma variável declarada em um bloco com let
só está disponível para uso dentro desse bloco. Deixe-me explicar isso com um exemplo:
let greeting = "say Hi"; let times = 4; if (times > 3) { let hello = "say Hello instead"; console.log(hello);// "say Hello instead" } console.log(hello) // hello is not defined
Vemos que usar hello
fora de seu bloco (as chaves onde foi definido) retorna um erro. Isso ocorre porque as let
variáveis têm escopo de bloco.
let pode ser atualizado, mas não declarado novamente.
Da mesma forma var
, uma variável declarada com let
pode ser atualizada dentro de seu escopo. Ao contrário var
, uma let
variável não pode ser declarada novamente dentro de seu escopo. Então, enquanto isso vai funcionar:
let greeting = "say Hi"; greeting = "say Hello instead";
isso retornará um erro:
let greeting = "say Hi"; let greeting = "say Hello instead"; // error: Identifier 'greeting' has already been declared
No entanto, se a mesma variável for definida em escopos diferentes, não haverá erro:
let greeting = "say Hi"; if (true) { let greeting = "say Hello instead"; console.log(greeting); // "say Hello instead" } console.log(greeting); // "say Hi"
Por que não há erro? Isso ocorre porque as duas instâncias são tratadas como variáveis diferentes, pois têm escopos diferentes.
This fact makes let
a better choice than var
. When using let
, you don't have to bother if you have used a name for a variable before as a variable exists only within its scope.
Also, since a variable cannot be declared more than once within a scope, then the problem discussed earlier that occurs with var
does not happen.
Hoisting of let
Just like var
, let
declarations are hoisted to the top. Unlike var
which is initialized as undefined
, the let
keyword is not initialized. So if you try to use a let
variable before declaration, you'll get a Reference Error
.
Const
Variables declared with the const
maintain constant values. const
declarations share some similarities with let
declarations.
const declarations are block scoped
Like let
declarations, const
declarations can only be accessed within the block they were declared.
const cannot be updated or re-declared
This means that the value of a variable declared with const
remains the same within its scope. It cannot be updated or re-declared. So if we declare a variable with const
, we can neither do this:
const greeting = "say Hi"; greeting = "say Hello instead";// error: Assignment to constant variable.
nor this:
const greeting = "say Hi"; const greeting = "say Hello instead";// error: Identifier 'greeting' has already been declared
Every const
declaration, therefore, must be initialized at the time of declaration.
This behavior is somehow different when it comes to objects declared with const
. While a const
object cannot be updated, the properties of this objects can be updated. Therefore, if we declare a const
object as this:
const greeting = { message: "say Hi", times: 4 }
while we cannot do this:
const greeting = { words: "Hello", number: "five" } // error: Assignment to constant variable.
we can do this:
greeting.message = "say Hello instead";
This will update the value of greeting.message
without returning errors.
Hoisting of const
Just like let
, const
declarations are hoisted to the top but are not initialized.
So just in case you missed the differences, here they are:
var
declarations are globally scoped or function scoped whilelet
andconst
are block scoped.var
variables can be updated and re-declared within its scope;let
variables can be updated but not re-declared;const
variables can neither be updated nor re-declared.- They are all hoisted to the top of their scope. But while
var
variables are initialized withundefined
,let
andconst
variables are not initialized. - Enquanto
var
elet
podem ser declarados sem serem inicializados,const
devem ser inicializados durante a declaração.
Tem alguma pergunta ou acréscimo? Por favor deixe-me saber.
Obrigado por ler :)