Javascript - Qual é a diferença entre var e let?
É uma questão de escopo.
Mas o que é escopo?
Escopo diz respeito à disponibilidade de uma variável. No javascript existem três tipos de escopos, o global, local e o de bloco. Este último foi adicionado no ES6.
Escopo global
Quando você declara uma variável fora de uma função, ela terá o escopo global, independente dela ter sido declarada com var ou let.
var teste1 = 5;
let teste2 = 10
function func() {
console.log(teste1); // 5
console.log(teste2); // 10
}
Neste caso ser declarada com var ou let não influencia o escopo. Será global para ambas variáveis.
Escopo local
Quando uma variável é declarada dentro de uma função ela irá possuir o escopo global. Podendo ser utilizada apenas dentro da função.
function teste1(){
var nome = “Bruno”;
let sobrenome = “Passos”;
console.log(nome); // Bruno
console.log(sobrenome); // Passos
}
function teste2(){
console.log(nome); // erro
console.log(sobrenome); // erro
}
console.log(nome) // erro
console.log(sobrenome); // erro
Desta forma podemos ver que a variável declarada dentro da função com var ou let estará disponível apenas dentro da função.
Escopo de bloco
Aqui veremos a grande diferença entre var e let. Para entendermos como funciona os escopo de bloco precisamos saber primeiro o que é um bloco. De forma simples podemos dizer que um bloco é tudo que estiver entre chaves ({}). Vemos em estruturas de condição, de repetição e outras entidades que trabalham com blocos. Desta forma podemos concluir que uma variável com escopo de bloco, é uma variável que foi declarada dentro de um determinado bloco. Ou seja, dentro de if, for, while, etc…
A única forma declarar uma variável dentro do escopo de bloco é utilizando a variável let.
var nota1 = 8;
var nota2 = 5;
if (nota1 >= 7) {
let resultado1 = "Aprovado";
console.log(resultado1); // Aprovado
}
console.log(resultado1); // erro
if (nota2 < 7) {
var resultado2 = "Reprovado";
console.log(resultado2); // Reprovado
}
console.log(resultado2); // Reprovado
function func() {
console.log(resultado1); // erro
console.log(resultado2); // Reprovado
}
Agora vemos que a variável que foi declarada com let dentro do if só pode ser acessada dentro dele, enquanto que a que foi declarada com var dentro de outro if também pode ser acessada de outros lugares.