Глядя на зарезервированные слова 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
уже был зарезервирован за много лет до того, как появились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, do
(с while
) в 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
как зарезервированное ключевое слово только в модулях. С тех пор правила зарезервированных ключевых слов стали только сложнее, так что они больше не описываются в лексической грамматике, а скорее как статические семантические ограничения.
При определении языка вы определяете зарезервированные ключевые слова, которые используются и могут быть использованы в будущем. И они подумали, что
const
может когда-нибудь использоваться, возможно, потому, что оно уже существовало в других языках.