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.