Можно ли использовать «let» и «const» в коде pre-ES6? - PullRequest
0 голосов
/ 30 мая 2018

Я (пере) изучаю Javascript, и мне было рекомендовано избегать смешивания кода типа ES5 и ES6.Но моя IDE, Webstorm, постоянно предупреждает меня, что я должен использовать let и const в моем коде - есть тонны желтых флагов.Конечно, я могу просто отключить эти предупреждения, но я должен всегда использовать let и const , когда это уместно, даже если остальная часть моего кода на данный момент является "старой школой"JavaScript?(Кроме того, я бы приветствовал любые ссылки / советы по рекомендациям и рекомендациям по переходу на ES6, т. Е. Лучший способ начать внедрение ES6 в ваш код).Спасибо!

1 Ответ

0 голосов
/ 12 декабря 2018

Основной ответ на ваш вопрос : нет, использование let и const в истинном ES5 не нормально.Вам нужно использовать var.Чтобы добавить к этому: если Webstorm выдает эти предупреждения, но вы пишете ES5, то ваши настройки неверны.Перейдите в «Настройки»> «Языки и рамки»> «Javascript» и измените версию языка Javascript на ECMAScript 5.1.Если вы знаете, что пишете ES5, вам не следует устанавливать его для проверки кода на соответствие спецификации ES6.

Вот дополнительная информация:

Недавно я работал над перехватомдо транспортера ( Babel ) для преобразования всего Javascript в ES5-совместимый синтаксис в производственной среде.Если вы хотите использовать синтаксис ES6, но по-прежнему должны поддерживать не совместимые с ES6 браузеры (например, IE9 - IE11), тогда необходим такой трансплайлер как Babel.Имея это в виду, я хотел бы привести некоторые конкретные примечания, относящиеся к let и const.

В истинном ES6 использование let для определения переменной создает ее в области действия ее блока.Это означает, что как только блок выходит, эта именованная переменная отбрасывается.Из-за этого возможно что-то вроде следующего:

const x = 'I am a constant';
if (1 == 1) {
  let x = 'Not here for long';
  console.log(x); // => 'Not here for long'
}
console.log(x); // => 'I am a constant';

При использовании let для создания экземпляра с областью действия x, который имеет приоритет над const x внутри этого блока (наш оператор ifв этом случае).То, во что превращает это Babel, чтобы сделать его совместимым с браузерами ES5, на самом деле довольно умно:

var x = 'I am a constant';
if (1 == 1) {
  var _x = 'Not here for long';
  console.log(_x); // => 'Not here for long'
}
console.log(x); // => 'I am a constant';

Как вы можете видеть здесь, на самом деле он создает новую переменную с другим именем, _x, поэтомуне конфликтует с оригинальным x.

Последнее замечание : если вы используете новые функции, такие как Promise и Symbol, тогда недостаточно транспилятора.Вы также должны использовать полифилл для них.

...