O guia de Babel para o ES6 diz:
let
é o novovar
.
Aparentemente, a única diferença é o var
escopo da função atual , enquanto o let
escopo do bloco atual . Existem alguns bons exemplos nesta resposta .
Não vejo nenhum motivo para usar var
no código ES6. Mesmo que você queira escopo uma dada variável para toda a função, você pode fazê-lo let
colocando a declaração na parte superior do bloco de funções, que é o que você deve fazer var
para indicar o escopo real. E se você deseja definir algo mais finamente em um for
bloco ou algo assim, também pode fazer isso.
Então, meu instinto é parar de usar var
completamente ao escrever o código ES6.
Minha pergunta é: estou errado sobre isso? Existe algum caso legítimo em var
que seria preferível let
?
javascript
es6
callum
fonte
fonte
var
como um indicador consciente de que essa variável deve ter escopo definido para toda a função pode ser uma convenção útil de "auto-documentação" .let
declaração no topo de uma função, acho óbvio que você pretendia colocá-la em escopo para toda a função. Eu não acho que usar ovar
torna mais claro do que simplesmente localizá-lo no topo.var
ainda existe, é a compatibilidade com versões anteriores. Se não fosse por isso, eles teriam sidovar
completamente removidos , ou nunca introduzidos,let
em vez disso, mudando a semânticavar
para o que deveria ter sido o tempo todo.var
parecem pequenos para mim, e não o suficiente para garantir um terceiro tipo de variável que se destaca. Você pode definir um escopolet
para uma função inteira simplesmente colocando-a na parte superior da função, o que é muito mais claro do que escrevervar
em um bloco (para que seja içada desse bloco para que você possa usá-lo fora do bloco) - esquisito). Ele alerta que, se você escopolet
a uma função, "é apenas a posição que sinaliza a diferença, em vez da sintaxe", mas acho que é uma coisa boa.var
. os exemplos que ele apresenta para mantervar
parecem inventados - e são baseados em graves erros de codificação. É muito melhor encontrar um erro e ser forçado a corrigi-lo do que usar as funções de linguagem que permitem escapar impune! O que vem a seguir, aconselhe a agrupar tudo em uma tentativa / captura para evitar falhas? O restante desse link é bom, mas não concordo com essa parte em particular.Respostas:
Doug Crockford discute
let
a este ponto em sua palestra, " as melhores partes ".O ponto é,
let
evita uma fonte de mal-entendido, esp. para programadores com expectativas definidas por idiomas com escopo de bloco. Avar
possui escopo de função (declara uma variável visível em toda a função), embora pareça ter escopo de bloco .var
ainda pode ser útil em casos extremos, como código gerado por máquina, mas estou me esforçando bastante por lá.(
const
também é novo e tem escopo de bloco. Depois quelet x = {'hi': 'SE'}
você pode reatribuir ax
, e depois queconst y = x
você não pode reatribuir ay
isso. Isso geralmente é preferível, pois impede que algo mude acidentalmente sob você. Mas, para ser claro, você ainda pode modificar o objeto, ay.hi = 'SO'
menos congele.)Realisticamente, sua impressão está certa no ES6: Adote
let
econst
. Pare de usarvar
.(Em outra apresentação de "The Better Parts" , Doug diz por que
===
foi adicionado ao invés de corrigir os problemas de==
.==
Produz alguns resultados "surpreendentes", então adote===
.)Um Exemplo Revelador
A Mozilla Developer Network fornece um exemplo em
var
que não funciona como pretendido. O exemplo deles é realista, que defineonclick
manipuladores em uma página da web. Aqui está um caso de teste menor:var
falha conosco porque todas as iterações de loop compartilham a mesmai
variável com escopo de função , que tem o valor5
após o término do loop.fonte
==
não está quebrado. Ele pode ser simplesmente definido comoequality comparison using coersion
Confira github.com/getify/You-Dont-Know-JS/blob/master/…[ '1.0' == 1.0, [1.0] == 1.0, [1.0] == '1.0', ['1.0'] == 1.0, [null] == '', [null] == 'null', '00' == false, [] == [], [] == 0, [] == '', [] == false, [] == true, [010] - [4] == ' 4.0 ', !![0], !![1], [0] == true, [1] == true, 1 == [[1]], 0 == [[0]], '1' == [1] ]
let
evar
mas entrelet
,var
econst
var
funciona como projetado, mas não quantas pessoas esperam. É um bug de usabilidade, não um bug de implementação.Se você tiver escrito o código correto, provavelmente poderá transformar todas as
var
instruções emlet
instruções sem nenhuma alteração semântica.let
é preferível porque reduz o escopo em que um identificador é visível. Ele nos permite declarar variáveis com segurança no local do primeiro uso.const
é preferívellet
. A menos que você precise alterar uma referência, use umaconst
declaração. Isso tem todos os benefícios delet
reduzir a presença de variáveis unitializadas e tornar o código geralmente mais fácil de raciocinar. Se você não tiver certeza se precisará alterar uma referência, declare-aconst
até que você se encontre explicitamente precisando fazer isso.fonte
Eu não necessariamente acho que você está errado, mas há advertências sobre o uso de var. Essencialmente,
let
deve ajudar os desenvolvedores a contornar a estupidez do JavaScript, principalmente com conflitos de nomes.var
, parece, tem um escopo maior, pois deseja ir para o escopo da função de fechamento. Haverá momentos em que você precisará de var, como quando você precisa que uma variável temp esteja disponível no escopo de um bloco dentro de uma função; caso contrário, preferirlet
ao invés de var ajudará os desenvolvedores a conflitos de nomenclatura. Em uma nota mais clara, já era hora de o ES6 apresentarlet
.fonte
var
em um bloco está disponível dentro de toda a função, sem escopo no bloco. É um recurso enganoso.Costumo concordar que apenas "let" deve ser usado em es6. AFIK, redeclarar um "let" gera um erro (o que é bom), enquanto que com "var", você simplesmente substitui o valor (embora o "modo estrito" no es5 também cuide disso).
fonte
let
significa "deixar variável igual". É uma declaração, em outras palavras, uma inicialização e atribuição.Existe em contraste com o
const
que, obviamente, significa "constante" - que é o oposto da variável.Algumas outras linguagens usam um prefixo para o objeto real em vez do objeto ao declará-lo (por exemplo,
def
é uma abreviação de "define função" - faltando completamente o ponto do que está sendo "def".Let
adiciona essa inconsistência semântica ao Javascript.Logicamente, você também pode deixar uma constante igual a algo, já que o trabalho da palavra-chave "let" é atribuir memória.
O problema surge porque a
var
palavra - chave foi introduzida antesconst
era suportada; portanto, a compatibilidade com versões anteriores exige quevar
não seja necessário uma variável. (Também pode ser usado para atribuir um valor constante.)Daí, a introdução de
let
na posição errada. Para garantir que lembremos que, lexicamente, isso está errado, eles também decidiram alterar o escopo lexical delet
vsvar
, de modo que a inconsistência é a principal em nossas mentes ao depurar.Em outras palavras,
let
existe porque as pessoas (ou seja, os mantenedores da linguagem) pensavam que o Javascript era muito consistente, tendo dominado todas as expressões idiomáticas e idiossincrasias, desejando mais.Nota lateral,
var
não funciona em blocos com "setas" se você deseja tratar os referidos blocos como fechamentos (porquevar
foi introduzido antes de tratar os blocos como fechamentos), maslet
funciona.fonte
let
porque ela está em desacordo com o tom de outras palavras-chave da mesma categoria no JavaScript. Ainda assim, isso não responde à pergunta e não é particularmente bem colocado. Downvotedlet
não são apenas desenvolvedores que desejam mais complexidade. Na verdade, é intuitivamente mais compreensível, porque quando você faz um loop e fecha sobre vars, o fechamento mantém o último valor da var, mas quando você faz o mesmo sobre deixa, cada fechamento no laço tem seu próprio valor para deixar, um la o exemplo por @ Jerry101 acima