Javascript
Qual é a diferença entre var e let no Javascript?
Em 2015 a linguagem Javascript foi bombardeada de novidades em sua implementação, uma delas foi a implementação da palavra reservada let, que por sua vez tem a mesma finalidade da var, ou seja, armazenar informações. Mas a grande questão que fica para os iniciantes no ES6 é: Qual é a diferença entre var e let no Javascript?
Uma resposta curta e simples para este questionamento é: “O que muda é o escopo”. Quando você declara uma variável com a palavra var, ela pode corresponder ao escopo global e local, já quando você faz isso com a palavra let, ela pode corresponder ao escopo global, local e de bloco. Caso não tenha ficado muito claro, vamos entender isso em detalhes agora.
O que é escopo?
Em poucas palavras, escopo é a propriedade que determina onde uma variável pode ser utilizada dentro de um programa, por exemplo, se você declara uma variável dentro de uma função, só aquela função consegue utilizar a variável, e SE você declara uma variável fora de uma função, ela pode ser acessada de qualquer parte daquele mesmo script, pois ela foi declarada globalmente. No Javascript existem 3 tipos de escopos, o global, local e de bloco (adicionado no ES6). Vamos ver em detalhes como cada um deles funciona para var e let a seguir.
Escopo global
Quando você declara uma variável fora de qualquer função, seja ela var ou let, ela tem o escopo global, pois qualquer função no script consegue utilizar esta variável. Veja abaixo um exemplo de uma variável global declarada com var:
var minhaVariavelGlobal = 10; function func1(){ console.log(minhaVariavelGlobal); } function func2(){ console.log(minhaVariavelGlobal); } function func3(){ console.log(minhaVariavelGlobal); } console.log(minhaVariavelGlobal);
Neste exemplo, todas as funções consegueM utilizar a variável, pois ela está declarada globalmente. Agora vejamos um exemplo com let:
let minhaVariavelGlobal = 10; function func1(){ console.log(minhaVariavelGlobal); } function func2(){ console.log(minhaVariavelGlobal); } function func3(){ console.log(minhaVariavelGlobal); } console.log(minhaVariavelGlobal);
O resultado é exatamente o mesmo, então isso significa que o escopo global serve tanto para var, como para let.
Escopo local
Uma variável é local quando ela é declarada dentro de alguma função, pois isso significa que apenas aquela função consegue enxergá-la. As demais funções do script não conseguem utilizá-la, pois a mesma foi declarada dentro de uma função específica. Neste ponto de vista, podemos dizer que o escopo local é completamente diferente do escopo global. Abaixo vamos ver um exemplo de uma variável declarada localmente com var.
// Consegue manipular a variável victor function func1(){ var victor = "Lima"; console.log(victor); } // NÃO Consegue manipular a variável victor function func2(){ console.log(victor); } // NÃO Consegue manipular a variável victor function func3(){ console.log(victor); }
Como você pode ver nos exemplo de código acima a func2 e a func3 não conseguem acessar a variável victor, pois ela foi declarada dentro do corpo da func1. O mesmo comportamento se repete para variáveis declaradas com let, até agora, nada de diferente.
Escopo de bloco
E é aqui o grande pulo do gato da diferença entre var e let. O escopo de bloco. Primeiro para entender como esse escopo funciona, precisamos entender o que é um bloco na linguagem Javascript.
Podemos dizer que um bloco é tudo aquilo em um código que está entre chaves ({ }), ou seja, estruturas condicionais, estruturas de repetição, entre outras entidades que trabalham com blocos. Então, em resumo, uma variável com escopo de bloco, é uma variável que foi declarada dentro de um determinado bloco, e apenas pode ser manipulada dentro daquele bloco, e nenhuma outra parte do código pode manipulá-la. Dentre todos os tipos de escopo este é o mais restrito.
Este tipo de escopo só funciona com variáveis declaradas com a palavra chave let e está é a grande diferença entre let e var. O escopo de bloco abaixo é um exemplo de uma variável let declarada dentro de um bloco if.
var condicao = true; if(condicao){ let minhaVariavel = 10; // É possível manipular a let, pois ela foi declarada // neste bloco console.log(minhaVariavel); } // ERRO, Não é possível acessar a variável, pois ela tem escopo de bloco. function func1(){ console.log(minhaVariavel); } // ERRO, Não é possível acessar a variável, pois ela tem escopo de bloco. function func2(){ console.log(minhaVariavel); } // ERRO, Não é possível acessar a variável, pois ela tem escopo de bloco. function func3(){ console.log(minhaVariavel); } // ERRO, Não é possível acessar a variável, pois ela tem escopo de bloco. console.log(minhaVariavel);
O Mesmo não se aplica quando você declara uma variável com var, pois o escopo de bloco não existe na palavra reservada var. Abaixo vejamos um exemplo.
var condicao = true; if(condicao){ var minhaVariavel = 10; console.log(minhaVariavel); } // Funciona, pois o escopo de bloco não existe para var function func1(){ console.log(minhaVariavel); } // Funciona, pois o escopo de bloco não existe para var function func2(){ console.log(minhaVariavel); } // Funciona, pois o escopo de bloco não existe para var function func3(){ console.log(minhaVariavel); } // Funciona, pois o escopo de bloco não existe para var console.log(minhaVariavel);
Conclusão
Em resumo, esta é a grande diferença entre declarar variáveis com var e let; tudo está resumido a escopo. Como já foi comentado no artigo, com a chegada do ES6 em 2015, o escopo de bloco foi implementado. Tirando este detalhe, que é muito expressivo, var e let servem para a mesma finalidade; e cabe a você, programador Javascript, decidir qual irá utilizar.