Почему `const` является зарезервированным ключевым словом в JS, а `let` нет

Глядя на зарезервированные слова JS (MDN ), кажется, что новые функции вводятся обратно совместимым образом, то есть var let = 0, async = 1, await = 2; является допустимым выражением, по крайней мере, вне режима strict. См.: Почему имена переменных await и async допустимы? и Почему `let` не указано как зарезервированное ключевое слово в спецификации

Однако const является ключевым словом, поэтому вы не можете использовать var const = 0; (см.: этот пост).

var let = 100; // OK
var const = 100; // SyntaxError: Cannot use the keyword 'const' as a variable name.

Что меня смущает: почему? Я предполагаю, что это означает, что const уже было зарезервировано за много лет до того, как появилось let/const, но какое значение оно имело тогда? Было ли это просто зарезервировано для будущих намерений?

При определении языка вы определяете зарезервированные ключевые слова, которые используются и могут быть использованы в будущем. И они подумали, что const может когда-нибудь использоваться, возможно, потому, что оно уже существовало в других языках.

t.niese 20.11.2022 20:06
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
учебник по Javascript
учебник по Javascript
JavaScript - это язык программирования, который обычно используется для добавления интерактивности и других динамических функций на веб-сайты. Он...
Как использовать d3.js для рисования 2D SVG-элементов в приложении Angular?
Как использовать d3.js для рисования 2D SVG-элементов в приложении Angular?
D3.js - это обширная библиотека, используемая для привязки произвольных данных к объектной модели документа (DOM). Мы разберем основные варианты...
Освоение принципов SOLID в JavaScript: Пошаговое руководство
Освоение принципов SOLID в JavaScript: Пошаговое руководство
Принцип единой ответственности (SRP): класс должен иметь только одну причину для изменения. Другими словами, у него должна быть только одна...
JavaScript - For Loop
JavaScript - For Loop
Наиболее используемая компактная форма оператора цикла.
Неделя 1 - Карточки с временной шкалой
Неделя 1 - Карточки с временной шкалой
Поскольку это была первая неделя, я решил начать с простого. Предполагалось, что у меня будет временная шкала с несколькими карточками, которые можно...
2
1
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я полагаю, это означает, что const уже был зарезервирован за много лет до того, как появились let/const?

Да. Вы можете найти его как зарезервированное слово, начиная с ECMAScript 1.

Но какое значение это имело тогда? Было ли это просто зарезервировано для будущих намерений?

Да:

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

FutureReservedWord :: one of
case   debugger  export   super
catch  default   extends  switch
class  do        finally  throw
const  enum      import   try

Многие из них использовались в более поздних версиях языка, например switch/case/default в ES3, try/catch/finally/throw в ES3, class/extends/super в ES6, export/import в ES6, dowhile) в ES3, оператор debugger в ES5 и const в ES6. enum — единственное ключевое слово, которое до сих пор безоговорочно зарезервировано на будущее во всех версиях языка.

ECMAScript 2 добавил еще больше зарезервированных ключевых слов, похожих на Java, список из того времени:

abstract  do import short
boolean   double      instanceof  static
byte      enum        int         super
case      export      interface   switch
catch     extends     long        synchronized
char      final       native      throw
class     finally     package     throws
const     float       private     transient
debugger  goto        protected   try
default   implements  public      volatile

ES3 реализовал несколько тем.

ES5 затем удалил некоторые Java-измы, такие как имена примитивных типов и модификаторы методов, но также ввел несколько новых зарезервированных ключевых слов (let, yield) и сделал различие в строгом режиме:

FutureReservedWord :: one of
class  enum    extends  super
const  export  import 

Следующие токены также считаются FutureReservedWords, когда они встречаются в коде строгого режима:

implements  let      private    public  yield
interface   package  protected  static

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

Другие вопросы по теме