O ECMAScript 6 apresentou a let
declaração .
Ouvi dizer que é descrita como uma variável "local", mas ainda não tenho certeza de como ela se comporta de maneira diferente da var
palavra - chave.
Quais são as diferenças? Quando deve let
ser usado var
?
let
está incluído no rascunho da 6ª edição e provavelmente estará na especificação final.Respostas:
Regras de escopo
A principal diferença está nas regras de escopo. As variáveis declaradas por
var
palavra-chave têm o escopo definido para o corpo da função imediata (daí o escopo da função) enquanto aslet
variáveis têm o escopo definido para o bloco envolvente imediato indicado por{ }
(daí o escopo do bloco).A razão pela qual a
let
palavra-chave foi introduzida na linguagem foi o escopo da função é confuso e foi uma das principais fontes de erros no JavaScript.Dê uma olhada neste exemplo de outra pergunta do stackoverflow :
My value: 3
foi emitido para o console toda vez quefuncs[j]();
foi chamado, pois funções anônimas estavam ligadas à mesma variável.As pessoas tinham que criar funções imediatamente invocadas para capturar o valor correto dos loops, mas isso também era complicado.
Elevação
Enquanto as variáveis declaradas com a
var
palavra - chave são hasteadas (inicializadas comundefined
antes da execução do código), isso significa que elas são acessíveis em seu escopo incluso antes mesmo de serem declaradas:let
variáveis não são inicializadas até que sua definição seja avaliada. Acessá-los antes da inicialização resulta em aReferenceError
. Variável que se diz estar na "zona morta temporal" desde o início do bloco até a inicialização ser processada.Criando propriedade de objeto global
No nível superior
let
, ao contráriovar
, não cria uma propriedade no objeto global:Redeclaração
No modo estrito,
var
você poderá declarar novamente a mesma variável no mesmo escopo enquantolet
gera um SyntaxError.fonte
let
a expressão de blocolet (variable declaration) statement
não é padrão e será removida no futuro, bugzilla.mozilla.org/show_bug.cgi?id=1023609 .let
também pode ser usado para evitar problemas com fechamentos. Ele vincula um novo valor ao invés de manter uma referência antiga, como mostrado nos exemplos abaixo.O código acima demonstra um problema clássico de fechamento do JavaScript. Referência ao
i
variável está sendo armazenada no fechamento do manipulador de cliques, em vez do valor real dei
.Cada manipulador de cliques se refere ao mesmo objeto, porque há apenas um contador que contém 6, para que você obtenha seis em cada clique.
Uma solução geral é agrupar isso em uma função anônima e passar
i
como argumento. Essas questões também podem ser evitados agora usandolet
em vezvar
como mostrado no código abaixo.(Testado no Chrome e Firefox 50)
fonte
let
, mas alerta "6" para todos os botões. Você tem alguma fonte dizendo comolet
deve se comportar?let
que seria realmente útil. A configuração de listeners de eventos em um loop não requer mais uma expressão de função imediatamente chamada para escopo locali
em cada iteração.Qual é a diferença entre
let
evar
?var
instrução é conhecida em toda a função em que é definida, desde o início da função. (*)let
instrução é conhecida apenas no bloco em que é definida, a partir do momento em que é definida em diante. (**)Para entender a diferença, considere o seguinte código:
Aqui, podemos ver que nossa variável
j
é conhecida apenas no primeiro loop for, mas não antes e depois. No entanto, nossa variáveli
é conhecida em toda a função.Além disso, considere que as variáveis com escopo de bloco não são conhecidas antes de serem declaradas porque não são içadas. Também não é permitido redefinir a mesma variável com escopo de bloco dentro do mesmo bloco. Isso torna as variáveis com escopo do bloco menos propensas a erros do que as variáveis com escopo global ou funcional, que são içadas e que não produzem erros no caso de várias declarações.
É seguro usar
let
hoje?Algumas pessoas argumentam que, no futuro, usaremos SOMENTE declarações let e essas declarações var se tornarão obsoletas. O guru do JavaScript Kyle Simpson escreveu um artigo muito elaborado sobre por que ele acredita que não será esse o caso .
Hoje, no entanto, esse definitivamente não é o caso. De fato, precisamos nos perguntar se é seguro usar a
let
declaração. A resposta para essa pergunta depende do seu ambiente:Se você estiver escrevendo o código JavaScript do servidor ( Node.js ), poderá usar a
let
instrução com segurança .Se você estiver escrevendo código JavaScript do lado do cliente e usar um transpiler baseado em navegador (como Traceur ou babel-standalone ), poderá usar a
let
instrução com segurança , no entanto, é provável que seu código seja qualquer coisa, menos ideal em relação ao desempenho.Se você estiver escrevendo código JavaScript do lado do cliente e usar um transpiler baseado em Nó (como o script shell de rastreamento ou Babel ), poderá usar a
let
instrução com segurança . E como o seu navegador só conhece o código transpilado, as desvantagens do desempenho devem ser limitadas.Se você estiver escrevendo um código JavaScript do lado do cliente e não usa um transpiler, considere o suporte ao navegador.
Ainda existem alguns navegadores que não oferecem suporte
let
:Como acompanhar o suporte ao navegador
Para uma visão geral atualizada de quais navegadores suportam a
let
declaração no momento da leitura desta resposta, consulte estaCan I Use
página .(*) Variáveis com escopo global e funcional podem ser inicializadas e usadas antes de serem declaradas porque as variáveis JavaScript são hasteadas . Isso significa que as declarações sempre estão no topo do escopo.
(**) As variáveis do escopo do bloco não são içadas
fonte
i
É conhecido em todo o bloco de funções! Começa comoundefined
(devido à elevação) até você atribuir um valor! O ps:let
também é içado (na parte superior do bloco que contém), mas fornece umReferenceError
quando referenciado no bloco antes da primeira atribuição. (ps2: Eu sou um tipo de ponto e vírgula, mas você realmente não precisa de ponto e vírgula depois de um bloco). Dito isto, obrigado por adicionar a verificação da realidade em relação ao suporte!let
evar
!let
econst
foram recomendado para uso apenas quando você realmente precisa de sua funcionalidade adicional , porque aplicação / verificando esses recursos extras (como somente gravação const) resultam em 'mais trabalho '(e nós de escopo adicionais na árvore de escopo) para o (s) mecanismo (s) atual (is) para aplicar / verificar / verificar / configurar.Aqui está uma explicação da
let
palavra - chave com alguns exemplos.Esta tabela na Wikipedia mostra quais navegadores suportam Javascript 1.7.
Observe que apenas os navegadores Mozilla e Chrome são compatíveis. IE, Safari e potencialmente outros não.
fonte
let
msdn.microsoft.com/en-us/library/ie/dn342892%28v=vs.85%29.aspxA resposta aceita está faltando um ponto:
fonte
for
inicializador de loop, estreitando drasticamente o escopo de aplicação das limitações delet
. Votado.let
Escopo do bloco
As variáveis declaradas usando a
let
palavra-chave têm escopo de bloco, o que significa que elas estão disponíveis apenas no bloco em que foram declaradas.No nível superior (fora de uma função)
No nível superior, as variáveis declaradas usando
let
não criam propriedades no objeto global.Dentro de uma função
Dentro de uma função (mas fora de um bloco),
let
tem o mesmo escopo quevar
.Dentro de um bloco
Variáveis declaradas usando
let
dentro de um bloco não podem ser acessadas fora desse bloco.Dentro de um loop
Variáveis declaradas com
let
loops podem ser referenciadas apenas dentro desse loop.Loops com tampas
Se você usar em
let
vez devar
em um loop, a cada iteração você obtém uma nova variável. Isso significa que você pode usar com segurança um fechamento dentro de um loop.Zona morta temporal
Por causa da zona morta temporal , as variáveis declaradas usando
let
não podem ser acessadas antes de serem declaradas. Tentar fazer isso gera um erro.Sem declarar novamente
Você não pode declarar a mesma variável várias vezes usando
let
. Você também não pode declarar uma variável usandolet
o mesmo identificador que outra variável que foi declarada usandovar
.const
const
é bem parecido comlet
o escopo do bloco e possui TDZ. Existem, no entanto, duas coisas que são diferentes.Sem reatribuição
A variável declarada usando
const
não pode ser reatribuída.Observe que isso não significa que o valor seja imutável. Suas propriedades ainda podem ser alteradas.
Se você deseja ter um objeto imutável, use
Object.freeze()
.O inicializador é necessário
Você sempre deve especificar um valor ao declarar uma variável usando
const
.fonte
Aqui está um exemplo da diferença entre os dois (o suporte foi iniciado para o chrome):
Como você pode ver, a
var j
variável ainda está tendo um valor fora do escopo do loop for (escopo do bloco), mas alet i
variável é indefinida fora do escopo do loop for.fonte
Existem algumas diferenças sutis - o
let
escopo se comporta mais como o escopo variável em mais ou menos qualquer outro idioma.por exemplo, ele escopo para o bloco anexo, eles não existem antes de serem declarados, etc.
No entanto, vale a pena notar que isso
let
é apenas uma parte das implementações mais recentes do Javascript e tem vários graus de suporte ao navegador .fonte
let
está incluído no rascunho da 6ª edição e provavelmente estará na especificação final.let
. Safari, IE e Chome, todos não.let
não aumenta, para usar uma variável definida por umalet
definida na parte superior do seu bloco. Se você tiver umaif
instrução que seja mais do que apenas algumas linhas de código, poderá esquecer que não poderá usar essa variável até que ela seja definida. GRANDE PONTO !!!let
elevará a variável ao topo do bloco. No entanto, referenciar a variável no bloco antes da declaração da variável resulta em um ReferenceError (minha nota: em vez de boa e velhaundefined
). A variável está em uma 'zona morta temporal' desde o início do bloco até a declaração ser processada. " O mesmo vale para "instruções de opção porque há apenas um bloco subjacente". Fonte: developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…A principal diferença é a diferença de escopo , enquanto let só pode estar disponível dentro do escopo declarado, como no loop for, var pode ser acessado fora do loop, por exemplo. Na documentação do MDN (exemplos também do MDN):
Além disso, não se esqueça do seu recurso ECMA6, por isso ainda não é totalmente suportado, por isso é melhor sempre transpilar para o ECMA5 usando Babel etc ... para obter mais informações sobre a visita ao site da babel
fonte
Variável não içadalet
vai não guincho para todo o escopo do bloco são apresentados. Por outro lado,var
poderia içar como abaixo.Na verdade, Per @Bergi, Both
var
elet
são içadas .Coleta de lixo
O escopo do bloco
let
é útil refere-se a fechamentos e coleta de lixo para recuperar a memória. Considerar,O
click
retorno de chamada do manipulador não precisa dahugeData
variável. Teoricamente, após asprocess(..)
execuções, a enorme estrutura de dadoshugeData
pode ser coletada como lixo. No entanto, é possível que algum mecanismo JS ainda tenha que manter essa estrutura enorme, pois oclick
função tem um fechamento em todo o escopo.No entanto, o escopo do bloco pode transformar essa enorme estrutura de dados em lixo coletado.
let
rotaçõeslet
no loop pode vinculá-lo novamente a cada iteração do loop, certificando-se de atribuir novamente o valor a partir do final da iteração anterior do loop. Considerar,No entanto, substitua
var
porlet
Como
let
crie um novo ambiente lexical com esses nomes para a) a expressão inicializadora b) cada iteração (antes de avaliar a expressão de incremento), mais detalhes estão aqui .fonte
Aqui está um exemplo para adicionar ao que outros já escreveram. Suponha que você queira criar uma matriz de funções, em
adderFunctions
que cada função use um único argumento Number e retorne a soma do argumento e o índice da função na matriz. Tentar geraradderFunctions
com um loop usando avar
palavra - chave não funcionará da maneira que alguém poderia esperar:O processo acima não gera a matriz de funções desejada porque
i
o escopo se estende além da iteração dofor
bloco no qual cada função foi criada. Em vez disso, no final do loop, oi
fechamento de cada função refere-se aoi
valor de no final do loop (1000) para cada função anônima emadderFunctions
. Não é isso que queríamos: agora temos uma matriz de 1000 funções diferentes na memória com exatamente o mesmo comportamento. E se atualizarmos posteriormente o valor dei
, a mutação afetará todos osadderFunctions
.No entanto, podemos tentar novamente usando a
let
palavra-chave:Desta vez,
i
é recuperado em cada iteração dofor
loop. Cada função agora mantém o valor dei
no momento da criação da função eadderFunctions
se comporta conforme o esperado.Agora, a imagem combina os dois comportamentos e você provavelmente verá por que não é recomendável misturar o mais novo
let
econst
o mais antigovar
no mesmo script. Fazer isso pode resultar em um código espetacularmente confuso.Não deixe isso acontecer com você. Use um linter.
fonte
let value = i;
. Afor
instrução cria um bloco lexical.A diferença está no escopo das variáveis declaradas com cada uma.
Na prática, há várias consequências úteis da diferença de escopo:
let
variáveis são visíveis apenas no bloco envolvente mais próximo ({ ... }
).let
variáveis são utilizáveis apenas em linhas de código que ocorrem após a declaração da variável (mesmo que sejam içadas !).let
variáveis não podem ser redeclaradas por um subseqüentevar
oulet
.let
Variáveis globais não são adicionadas aowindow
objeto global .let
As variáveis são fáceis de usar nos fechamentos (elas não causam condições de corrida ).As restrições impostas
let
reduzem a visibilidade das variáveis e aumentam a probabilidade de colisões inesperadas de nomes serem encontradas com antecedência. Isso facilita o rastreamento e o raciocínio sobre as variáveis, incluindo sua acessibilidade (ajudando na recuperação de memória não utilizada).Consequentemente,
let
é menos provável que as variáveis causem problemas quando usadas em programas grandes ou quando estruturas desenvolvidas independentemente são combinadas de maneiras novas e inesperadas.var
ainda pode ser útil se você tiver certeza de que deseja o efeito de ligação única ao usar um fechamento em um loop (nº 5) ou para declarar variáveis globais visíveis externamente em seu código (nº 4). O uso devar
para exportações pode ser substituído seexport
migrar do espaço do transpiler para o idioma principal.Exemplos
1. Não usar fora do bloco anexo mais próximo: Este bloco de código gerará um erro de referência porque o segundo uso de
x
ocorre fora do bloco em que é declarado comlet
:Por outro lado, o mesmo exemplo com
var
obras.2. Sem uso antes da declaração:
Este bloco de código lançará um
ReferenceError
antes que o código possa ser executado porquex
é usado antes de ser declarado:Por outro lado, o mesmo exemplo
var
analisa e é executado sem gerar nenhuma exceção.3. Sem redeclaração: O código a seguir demonstra que uma variável declarada com
let
não pode ser redeclarada posteriormente:4. Globais não ligados a
window
:5. Fácil utilização com fechamentos: Variáveis declaradas com
var
não funcionam bem com fechamentos dentro de loops. Aqui está um loop simples que gera a sequência de valores que a variáveli
possui em diferentes pontos no tempo:Especificamente, isso gera:
No JavaScript, geralmente usamos variáveis em um período significativamente posterior ao quando elas são criadas. Quando demonstramos isso, adiando a saída com um fechamento passado para
setTimeout
:... a saída permanece inalterada enquanto permanecermos
let
. Por outro lado, se tivéssemos usadovar i
:... o loop gera inesperadamente "i is 5" cinco vezes:
fonte
var
vez delet
, o código é equivalente a:var i = 0; while (i < 5) { doSomethingLater(); i++; }
i
está fora do fechamento e, no momento em quedoSomethingLater()
é executado,i
já foi incrementado 5 vezes, portanto, a saída éi is 5
cinco vezes. Ao usarlet
, a variáveli
está dentro do fechamento, portanto, cada chamada assíncrona obtém sua própria cópia, emi
vez de usar a 'global' criada com elavar
.for
. Uma transformação mais precisa, embora mais complicada, é o clássicofor (var i = 0; i < 5; i++) { (function(j) { setTimeout(_ => console.log(
i é $ {j},), 125/*ms*/); })(i); }
que introduz um "registro de ativação da função" para salvar cada valori
com o nome dej
dentro da função.Que as duas funções a seguir mostrem a diferença:
fonte
let
é interessante, porque nos permite fazer algo assim:O que resulta na contagem de [0, 7].
Enquanto que
Conta apenas [0, 1].
fonte
Função VS escopo do bloco:
A principal diferença entre
var
elet
é que as variáveis declaradas comvar
têm escopo de função . Enquanto as funções declaradas comlet
têm escopo de bloco . Por exemplo:variáveis com
var
:Quando a primeira função
testVar
é chamada, a variável foo, declarada comvar
, ainda está acessível fora daif
instrução. Essa variávelfoo
estaria disponível em qualquer lugar dentro do escopo datestVar
função .variáveis com
let
:Quando a segunda função
testLet
é chamada de variável bar, declarada comlet
, só é acessível dentro daif
instrução. Como as variáveis com declaradolet
são bloco escopo (onde um bloco é o código entre chavetas, por exemploif{}
,for{}
,function{}
).let
variáveis não são içadas:Outra diferença entre
var
elet
é as variáveis declaradas comlet
não são içadas . Um exemplo é a melhor maneira de ilustrar esse comportamento:variáveis com
let
não são içadas:variáveis com
var
afazeres get içada:Global
let
não se apega awindow
:Uma variável declarada com
let
no escopo global (que é um código que não está em uma função) não é adicionada como uma propriedade nowindow
objeto global . Por exemplo (este código está no escopo global):Use
let
maisvar
sempre que você pode, porque é simplesmente escopo mais específico. Isso reduz possíveis conflitos de nomes que podem ocorrer ao lidar com um grande número de variáveis.var
pode ser usado quando você deseja que uma variável global esteja explicitamente nowindow
objeto (sempre considere com cuidado se isso é realmente necessário).fonte
Parece também que, pelo menos no Visual Studio 2015, o TypeScript 1.5, "var" permite várias declarações com o mesmo nome de variável em um bloco e "let" não.
Isso não gerará um erro de compilação:
Isso vai:
fonte
var
é uma variável de escopo global (passível de elevação).let
econst
é escopo de bloco.fonte
Ao usar
let
A
let
palavra-chave anexa a declaração da variável ao escopo de qualquer bloco (geralmente um{ .. }
par) em que está contido. Em outras palavras,let
seqüestra implicitamente o escopo de qualquer bloco para sua declaração de variável.let
variáveis não podem ser acessadas nowindow
objeto porque não podem ser acessadas globalmente.Ao usar
var
var
e as variáveis no ES5 têm escopos em funções, o que significa que as variáveis são válidas dentro da função e não fora da própria função.var
variáveis podem ser acessadas nowindow
objeto porque não podem ser acessadas globalmente.Se você quiser saber mais, continue lendo abaixo
uma das perguntas de entrevista mais famosas sobre o escopo também pode ser suficiente para o uso exato
let
evar
abaixo;Ao usar
let
Isso ocorre porque ao usar
let
, para cada iteração de loop, a variável tem escopo definido e possui sua própria cópia.Ao usar
var
Isso ocorre porque, ao usar
var
, para cada iteração de loop, a variável tem escopo definido e possui cópia compartilhada.fonte
Na maioria dos termos básicos,
⚡️ Sandbox para brincar ↓
fonte
Se eu li as especificações corretamente,
let
felizmente também pode ser aproveitado para evitar funções auto-chamadas usadas para simular membros particulares - um padrão de design popular que diminui a legibilidade do código, complica a depuração, que não adiciona proteção real ao código ou outros benefícios - exceto, talvez, a satisfação de alguém. desejo de semântica, então pare de usá-lo. / discurso retóricoConsulte ' Emulando interfaces privadas '
fonte
let
? (Suponho que você queira dizer IIFE com "função de auto-invocação".)hiddenProperty
no construtor? Existe apenas umhiddenProperty
para todas as instâncias da sua "classe".Alguns hacks com
let
:1
2)
3)
Getter e setter com
let
:fonte
let { type, name, value } = node;
? você cria um novo objeto com 3 propriedades, digite / nome / valor e inicializa-os com os valores de propriedades do nó?var
também.let vs var. É tudo sobre escopo .
variáveis var são globais e podem ser acessadas basicamente em qualquer lugar, enquanto variáveis variáveis não são globais e só existem até que um parêntese de fechamento as mate.
Veja meu exemplo abaixo e observe como a variável lion (let) age de maneira diferente nos dois console.logs; fica fora do escopo no segundo console.log.
fonte
fonte
let faz parte de es6. Essas funções explicam a diferença de maneira fácil.
fonte
A seguir, mostramos como 'let' e 'var' são diferentes no escopo:
A
gfoo
, definida porlet
, inicialmente, está no escopo global , e quando nós declaramosgfoo
novamente dentro doif clause
seu escopo mudou e quando um novo valor é atribuído à variável dentro desse âmbito que não afeta o escopo global.Considerando que
hfoo
, definido porvar
é inicialmente no escopo global , mas novamente quando o declaramos dentro doif clause
, ele considera o escopo global hfoo, embora var tenha sido usado novamente para declará-lo. E quando atribuímos novamente seu valor, vemos que o escopo global hfoo também é afetado. Essa é a principal diferença.fonte
Como acima mencionado:
Exemplo 1:
Nos meus dois exemplos, tenho uma função
myfunc
.myfunc
contém uma variávelmyvar
igual a 10. No meu primeiro exemplo, verifico semyvar
é igual a 10 (myvar==10
). Se sim, declaro uma variávelmyvar
(agora tenho duas variáveis myvar) usando avar
palavra-chave e atribuo um novo valor (20). Na próxima linha, imprimo seu valor no meu console. Após o bloco condicional, imprimo novamente o valor demyvar
no meu console. Se você olhar para a saída demyfunc
,myvar
tem valor igual a 20.Exemplo2: No meu segundo exemplo, em vez de usar a
var
palavra-chave no meu bloco condicional, declaromyvar
usar alet
palavra-chave. Agora, quando ligomyfunc
, recebo duas saídas diferentes:myvar=20
emyvar=10
.Portanto, a diferença é muito simples, ou seja, seu escopo.
fonte
Quero vincular essas palavras-chave ao contexto de execução, porque o contexto de execução é importante em tudo isso. O contexto de execução possui duas fases: uma fase de criação e uma fase de execução. Além disso, cada contexto de execução possui um ambiente variável e um ambiente externo (seu ambiente lexical).
Durante a fase de criação de um contexto de execução, var, let e const ainda armazenam sua variável na memória com um valor indefinido no ambiente variável do contexto de execução especificado. A diferença está na fase de execução. Se você usar como referência uma variável definida com var antes de atribuir um valor, ela será indefinida. Nenhuma exceção será gerada.
No entanto, você não pode fazer referência à variável declarada com let ou const até que seja declarada. Se você tentar usá-lo antes de ser declarado, uma exceção será gerada durante a fase de execução do contexto de execução. Agora a variável ainda estará na memória, cortesia da fase de criação do contexto de execução, mas o mecanismo não permitirá que você a use:
Com uma variável definida com var, se o Mecanismo não puder encontrar a variável no Ambiente Variável do Contexto de Execução atual, ele subirá a cadeia de escopo (o Ambiente Externo) e verificará a variável no Ambiente Variável do Ambiente Externo. Se não conseguir encontrá-lo, continuará pesquisando a cadeia de escopo. Este não é o caso de let e const.
A segunda característica do let é que ela introduz o escopo do bloco. Os blocos são definidos por chaves. Os exemplos incluem blocos funcionais, se blocos, para blocos, etc. Quando você declara uma variável com deixar entrar um bloco, a variável está disponível apenas dentro do bloco. De fato, toda vez que o bloco é executado, como dentro de um loop for, ele cria uma nova variável na memória.
O ES6 também introduz a palavra-chave const para declarar variáveis. const também tem escopo definido no bloco. A diferença entre let e const é que as variáveis const precisam ser declaradas usando um inicializador, ou isso gerará um erro.
E, finalmente, quando se trata do Contexto de Execução, as variáveis definidas com var serão anexadas ao objeto 'this'. No contexto de execução global, esse será o objeto de janela nos navegadores. Este não é o caso de let ou const.
fonte
Eu acho que os termos e a maioria dos exemplos são um pouco esmagadores. O principal problema que tive pessoalmente com a diferença é entender o que é um "bloco". Em algum momento, percebi que um bloco seria qualquer colchete, exceto a
IF
declaração. um colchete{
de abertura de uma função ou loop definirá um novo bloco, qualquer coisa definidalet
dentro dele, não estará disponível após o colchete}
de fechamento da mesma coisa (função ou loop); Com isso em mente, era mais fácil entender:fonte
Agora, acho que há melhor escopo de variáveis para um bloco de instruções usando
let
:Acho que as pessoas começarão a usar let aqui depois para que tenham escopo semelhante em JavaScript, como outras linguagens, Java, C # etc.
Pessoas sem um entendimento claro sobre o escopo no JavaScript costumavam cometer o erro anteriormente.
O içamento não é suportado usando
let
.Com essa abordagem, os erros presentes no JavaScript estão sendo removidos.
Consulte ES6 em profundidade: deixe e const para entendê-lo melhor.
fonte
Este artigo define claramente a diferença entre var, let e const
https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75#.esmkpbg9b
fonte