Если ключевое слово let
вводит правильную реализацию области блока, имеет ли var
более подходящий вариант? Я смотрю на это с точки зрения разработки программного обеспечения, а не на синтаксическую, "хорошо вы могли" точку зрения.
Каков прецедент для var в ES6?
Ответ 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)