¿Cuál es el caso de uso para var en ES6?

Si la palabra clave let introduce una implementación adecuada del scope del bloque, ¿ var ya tiene un caso de uso? Estoy mirando esto desde el punto de vista del diseño de software en lugar de hacerlo desde un punto de vista sintáctico, “bien podrías”.

Si la palabra clave let introduce una implementación adecuada del scope del bloque, ¿ var ya tiene un caso de uso?

Podría haber un caso de uso: las declaraciones en scope global no crean una propiedad en el objeto global. Ejemplo:

 "use strict"; // for chrome var foo = 42; let bar = 21; console.log('window.foo (var)', window.foo); // 42 console.log('window.bar (let)', window.bar); // undefined 

let no puede ser usado en scope global todavía . var puede.

Esto es lo que obtienes de Chrome cuando intentas let global el modo estricto:

Declaraciones con ámbito de bloque (let, const, function, class) aún no admitidas fuera del modo estricto

Prácticamente hay algunos casos de uso que encontré para mí.

A veces puede querer declarar la variable en try-catch de la siguiente manera:

 try { //inits/checks code etc let id = getId(obj); var result = getResult(id); } catch (e) { handleException(e); } //use `result` 

Con let la statement del result sería antes de try , que es un poco pronto y fuera de contexto para el autor y un lector del código.

Lo mismo ocurre con las declaraciones condicionales:

 if (opts.re) { var re = new RegExp(opts.re); var result = match(re); if (!result) return false; } //use result here safely 

Con esto let este código se verá un poco forzado a quejarse de “buen estilo”, aunque podría ser poco práctico.

También puedo imaginar el caso en el que te gustaría usar variables que pertenecen al bloque de bucle:

 for (var x = 0; x < data.width; x++) { if (data[x] == null) break; //some drawing/other code } //here we have the `x` pointing to the end of data 

Alguien con altos estándares de belleza puede considerarlo desordenado, yo mismo prefiero que lo let , pero si el código que edito ya contiene var s, es natural usarlos y facilita la encoding.

Puedes usar var si quieres deconstruir algo en el ámbito de la función, por ejemplo, un condicional:

 if (Math.random() > 0.5) var {a,b} = {a: 1, b: 2} else var {a,b} = {a: 10, b: 20} // Some common logic on a and b console.log(a, b) 

Con let deberías escribir algo como

 let result; if (Math.random() > 0.5) result = {a: 'foo', b: 'bar'} else result = {a: 'baz', b: 'qux'} // Using const might make more sense here let {a, b} = result; // Some common logic on a and b console.log(a,b)