Каков прецедент для var в ES6?

Если ключевое слово let вводит правильную реализацию области блока, имеет ли var более подходящий вариант? Я смотрю на это с точки зрения разработки программного обеспечения, а не на синтаксическую, "хорошо вы могли" точку зрения.

Ответ 1

Если ключевое слово let вводит правильную реализацию области блока, имеет ли var более подходящий вариант?

Может существовать один прецедент: объявления let в глобальной области не создают свойства для глобального объекта. Пример:

"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

Ответ 2

let не может использоваться в глобальной области еще. var может.

Это то, что вы получаете от Chrome, когда вы пытаетесь использовать глобальный let вне строгого режима:

Объявления с расширенной областью (let, const, function, class) еще не поддерживаются в строгом режиме

Ответ 3

Практически есть некоторые варианты использования, которые я нашел для себя.

Иногда вам может потребоваться объявить переменную в try-catch следующим образом:

try {
    //inits/checks code etc
    let id = getId(obj);

    var result = getResult(id);
} catch (e) {
    handleException(e);
}

//use `result`

С let объявление result должно быть до try, которое немного раннее и вне контекста для автора и читателя кода.

То же самое для условных объявлений:

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

//use result here safely

С let этот код будет немного заставлять жаловаться на "хороший стиль", хотя это может быть непрактичным.

Также я могу представить случай, когда вы хотите использовать переменные, принадлежащие блоку цикла:

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

Кто-то с высокими стандартами красоты может считать это неопрятным, я сам предпочитаю let s, но если код, который я редактирую, уже содержит var - это естественно использовать их и упрощает кодирование.

Ответ 4

Один ценный вариант использования: итерационная производительность.

Спецификация имеет let в заголовке цикла, создавая совершенно новую среду для каждой итерации (§ 13.7.4.9). Это делается для упрощения построения замыканий в петлях. Напротив, var создает одну среду для всего цикла.

Я показываю let как , делая цикл for в 3-4 раза медленнее как в node, так и в браузере (тест производительности здесь):

const iterations=1000000000; // 1 billion iterations
for(var i=0;i<iterations;i++); // 1.558 seconds
for(let i=0;i<iterations;i++); // 4.986 seconds (*** 3-4 times slower than the others)
var i;(i=0;i<iterations;i++); // 1.381 seconds
let i;(i=0;i<iterations;i++); // 1.36 seconds
var i=0;(;i<iterations;i++); // 1.37 seconds
let i=0;(;i<iterations;i++); // 1.389 seconds

Использование var загрязняет окружающую среду функций. Использование let вне цикла предотвращает поражение производительности, но все еще загрязняет окружающую среду окружения.

Если вам нужна переменная loop-local итерации без удара производительности, вы можете использовать эту болезненную идиому:

{let i=0;for(;i<100;i++){
  console.log(i); // iteration code here
}}
i; // ReferenceError: i is not defined

Ответ 5

Вы можете использовать var если хотите что-то деконструировать в области функций, например условное:

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)

let вам придется писать что-то вроде

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)