Основной ответ на ваш вопрос : нет, использование 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
, тогда недостаточно транспилятора.Вы также должны использовать полифилл для них.