Existe algum motivo para usar a palavra-chave “var” no ES6?

242

O guia do ES6 do Babel diz:

let is the new var.

Aparentemente, a única diferença é que var fica com o escopo definido para a função atual , enquanto let fica com o escopo definido para o bloco atual. Existem alguns bons exemplos em esta resposta .

Não vejo motivo para usar var no código ES6. Mesmo se você quiser escopo de uma determinada variável para toda a função, você pode fazê-lo com let , colocando a declaração no topo do bloco de funções, que é o que você deve fazer com var de qualquer maneira para indicar o real escopo. E se você quiser entender melhor algo em um bloco for ou algo assim, você também pode fazer isso.

Então meu instinto é parar de usar var ao escrever o código ES6.

Minha pergunta é: estou errado sobre isso? Existe algum caso legítimo em que var seria preferível em relação a let ?

    
por callum 24.02.2015 / 23:08
fonte

5 respostas

200

Doug Crockford discute let em este ponto em sua palestra, "The Better Parts ".

O ponto é, let evita uma fonte de mal-entendido, esp. para programadores com expectativas definidas por idiomas com o escopo de bloco. Um var tem escopo de função (ele declara uma variável que é visível em toda a função) mesmo que pareça como se tivesse escopo de bloco . / p>

var talvez ainda seja útil em casos extremos, como código gerado por máquina, mas estou me esforçando muito nesse ponto.

( const também é novo e tem escopo de bloco. Depois de let x = {'hi': 'SE'} você pode reatribuir a x , enquanto depois de const y = x você não pode reatribuir a y . Isso geralmente é preferível, pois impede que algo mude acidentalmente Mas para ficar claro, você ainda pode modificar o objeto y.hi = 'SO' a menos que você o congele.)

Realisticamente, sua impressão está correta no ES6: Adotar let e const . Pare de usar var .

(Em outro desempenho de "The Better Parts" , Doug diz por que === foi adicionado em vez de consertando os problemas de == . == produz alguns resultados "surpreendentes", portanto, apenas adote === .


Um exemplo de revelação

A Mozilla Developer Network dá um exemplo onde var não funciona como pretendido. Seu exemplo é um exemplo realista que define onclick manipuladores em uma página da web. Aqui está um caso de teste menor:

var a = [];
(function () {
   'use strict';
   for (let i = 0; i < 5; ++i) { // *** 'let' works as expected ***
     a.push( function() {return i;} );
   }
} ());
console.log(a.map( function(f) {return f();} ));
// prints [0, 1, 2, 3, 4]

// Start over, but change 'let' to 'var'.
// prints [5, 5, 5, 5, 5]

var nos falha porque todas as iterações de loop compartilham a mesma variável com escopo de função i , que tem o valor 5 após a conclusão do loop.

    
por 24.02.2015 / 23:58
fonte
8

Se você tiver escrito o código correto, provavelmente será possível transformar todas as instruções var em instruções let sem nenhuma alteração semântica.

let é preferível porque reduz o escopo no qual um identificador é visível. Isso nos permite declarar variáveis com segurança no local do primeiro uso.

const é preferível a let . A menos que você precise alterar uma referência, use uma declaração const . Isso tem todos os benefícios de let , além de 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 de que precisará alterar uma referência, declare-o em const até que esteja explicitamente obrigado a fazê-lo.

    
por 26.06.2016 / 07:53
fonte
4

Eu não acho necessariamente que você esteja errado, mas há advertências para usar o var. Essencialmente, let deve ajudar os desenvolvedores a contornar a estupidez do JavaScript, particularmente com conflitos de nomenclatura. O var , ao que parece, tem um escopo maior, pois quer ir para o escopo da função closes. Haverá momentos em que você precisará de var, como quando precisar que uma variável temporária esteja disponível dentro do escopo de um bloco dentro de uma função; caso contrário, a preferência de let over var ajudará os desenvolvedores com conflitos de nomenclatura. Em uma nota mais clara, é hora de o ES6 introduzir o let .

    
por 24.02.2015 / 23:40
fonte
1

Eu tenho a tendência de concordar que apenas "let" deve ser usado em es6. AFIK, redeclarando um "let" gera um erro (o que é bom), enquanto que com "var", você simplesmente sobrescreve o valor (embora "strict mode" em es5 cuide disso também).

    
por 10.01.2016 / 20:26
fonte
-4

let significa "variável igual". É uma declaração, em outras palavras, uma inicialização e atribuição.

Existe em contraste com const , o que 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 "definir função" - perdendo completamente o ponto do que está sendo "def".

Let adiciona essa inconsistência semântica ao Javascript.

Logicamente, você poderia deixar uma constante igual a algo também, já que o trabalho da palavra-chave "let" é atribuir memória.

O problema surge porque a palavra-chave var foi introduzida antes de o const ser suportado, portanto, a compatibilidade com versões anteriores determina que var não significa necessariamente uma variável. (Também pode ser usado para atribuir um valor constante.)

Daí a introdução de let na posição errada. Para ter certeza de que nos lembramos de que, lexicamente, isso está errado, eles também decidiram mudar o escopo léxico de let vs var , então a inconsistência é a mais importante em nossas mentes quando depuramos.

Em outras palavras, let existe porque as pessoas (ou seja, os mantenedores da linguagem) achavam que o Javascript era muito consistente, tendo dominado todas as idiossincrasias e idiossincrasias, desejavam mais.

Nota lateral, var não funciona nos blocos "seta" se você quiser tratar os blocos como encerramentos (porque var foi introduzido antes de tratar os blocos como encerramentos), mas let faz.

    
por 08.02.2016 / 20:33
fonte