O ECMAScript 6 vem chegando e existem diversas novas modificações que tornarão a linguagem Javascript mais robusta
e mais preparada para o nosso tempo. Duas das novas funcionalidades são as palavras-chave let
e const
.
let
Até o ECMAScript 5, no JavaScript existiam apenas dois tipos de escopo, o escopo da função e o escopo global. Isto causava muita frustração e comportamentos inesperados para pessoas que utilizavam anteriormente outras linguagens, como C, C++, C# e Java.
O motivo é que o JavaScript até então não tinha um escopo de bloco e com ele espera-se que uma variável deva existir e ser acessível apenas dentro do bloco que ela for definida. Um bloco é tudo que está envolvido dentro das chaves em JavaScript. No exemplo abaixo podemos ter uma ideia do que o escopo de bloco significaria:
...
if (true) {
var value = "ok";
console.log(value); // imprime ok
}
console.log(value); // imprime ok mas não deveria
...
Na saída da execução deste código teríamos:
ok
ok
Se pensássemos de forma “não-javascript” esperaríamos que fora do bloco if
não se possa acessar a variável
value
. Por exemplo, executando um código equivalente a esse em C# ele nem compilaria, pois o
compilador avisaria que o código estava tentando utilizar uma variável fora do seu escopo. Mas no JavaScript isto é
possível e o comportamento é estranho.
Com o ECMAScript 6 finalmente teremos os escopo de bloco. O pessoal da organização ECMA sabiam que eles não seria
possível mudar o comportamento da palavra var
por questões de compatibilidade retroativa. Então
eles decidiram criar uma nova chamada let
. Ela poderá ser usada para definir variáveis de escopo para
serem usadas apenas dentro do bloco que elas foram declaradas.
Para explicar por que você deve aguardar ansiosamente pelo let
vamos entender um exemplo. Imagine que você precise
fazer um código que te retorne um array de 10 funções. Cada uma das funções deve lhe retornar o seu número de ordem.
Por exemplo a 1ª função do array deve retornar 1
enquanto a nª função deve retornar n
. Geralmente tendemos
a fazer isto:
var arr = [];
for (var i = 0; i < 10; i++) {
arr.push(function(){ return i });
}
Então podemos reconhecer claramente o problema de escopo. No exemplo acima a variável i
assume o escopo
global. Logo todas as funções do array retornarão 10
.
Ruim né? Mas o let
pode resolver este problema!
var arr = [];
for (var i = 0; i < 10; i++) {
let j = i;
arr.push(function(){ return j });
}
Muito bom! Problema resolvido!
E quando podemos começar a usar esta funcionalidade? Infelizmente ainda não existe nenhum browser do mercado que
a implemente, mas existem alguns compiladores de JavaScript como o compilador de templates
EJS que já implementa completamente o let
. A partir do Chrome 38 você pode
utilizar a palavra-chave parcialmente através da ativação da flag “Funcionalidades Experimentais de JavaScript”.
const
Já a palavra-chave const
terá um funcionamento similar à mesma nas outras linguagens, ou seja, a associação de
um valor a um nome e este valor jamais poderá ser alterado.
Esta abordagem é bastante válida se considerarmos a criação de constantes matemáticas como a definição do valor de pi, a constante de gravidade ou outra coisa do tipo.
As constantes funcionam como o let
, isto quer dizer que dentro do mesmo escopo de bloco também não podem ser
redeclaradas e não tem validade fora dele.
Por enquanto o único browser que implementa completamente a palavra-chave const
é o IE11, porém isto não quer
dizer que não funciona em alguns outros browsers. No Chrome por exemplo ainda falta eles implementarem o tratamento
para redefinição de uma constante e o escopo por bloco, mas já é possível fazer alguns testes.
Para maiores informações de como está a compatibilidade dos browsers para estas novas funcionalidades visite http://kangax.github.io/compat-table/es6