Почему `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
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
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 как зарезервированное ключевое слово только в модулях. С тех пор правила зарезервированных ключевых слов стали только сложнее, так что они больше не описываются в лексической грамматике, а скорее как статические семантические ограничения.

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