Использование зарезервированных слов в Javascript - PullRequest
3 голосов
/ 12 ноября 2011

В Javascript есть различные зарезервированные слова , которые нельзя использовать внутри Identifiers;некоторые из них фактически зарезервированы для будущего использования.Для пояснения, Identifier - это Identifier Name, но не зарезервированное слово.Точная грамматика имен идентификаторов здесь не имеет значения.

Согласно последнему абзацу здесь , тем не менее, кажется, что есть какое-то место, где можно использовать любой Identifier Name,даже если это зарезервированное слово.В статье упоминается как действительный

a.import
a["import"]
a = { import: "test" }

Хотя мне ясно, что вторая форма является законной, я всегда думал, что первая и третья не были.

На самом деле, этот ресурс обозначает

foo.if

как недействительный код.

Есть ли места, где зарезервированные слова действительно действительны?

КакВ качестве мотивации я пишу API, в котором имеет смысл передавать объекты в форме

{
    in: foo,
    out: bar
}

, но я не хочу заставлять пользователей ставить скобки вокруг in.

Ответы [ 4 ]

5 голосов
/ 12 ноября 2011

Это изменение в ECMA-262 между выпусками 3 и 5 (которое вы можете получить здесь ).

В обоих выпусках раздел 7.6 определяет идентификатор as

Identifier ::
    IdentifierName but not ReservedWord

Однако в разделе 11.2.1 средства доступа к свойствам, использующие точечную запись, были изменены с

MemberExpression . Identifier
CallExpression . Identifier

в издании 3 на

MemberExpression . IdentifierName
CallExpression . IdentifierName

виздание 5, т. е. использование зарезервированных имен в качестве точек доступа действительно допустимо сейчас .

Я не знаю, было ли сделано это изменение только потому, что ограничение на Идентификатор Синтаксически не нужно, потому что ни одно из зарезервированных слов не может юридически следовать . или если оно также кодифицирует существующую практику различных реализаций.

PS: После некоторого поиска я обнаружил следующеев письме от Allen Wirfs-Brock , редакторе проекта для редакции 5:

Грамматика ES3 не позволяет использовать зарезервированные слова (такие как true и false) в качествеPropertyName или справа от периода в MemberExpression.Ваши тесты подтверждают, что большинство реализаций соответствуют этому ограничению, в то время как FF имеет «нестандартное» расширение, которое позволяет намеренно использовать зарезервированные слова (или, по крайней мере, те, которые вы тестировали) в этих контекстах.

ES3.1 преднамереннопринял расширение FF в качестве стандартной части языка, поэтому, когда другая реализация в конечном итоге обновляется для поддержки ES3.1, они не должны долго сообщать об ошибках для ваших тестовых случаев.

Обратите внимание, что ECMAScript 3.1 былоригинальное название для того, что теперь известно как ECMAScript 5.

1 голос
/ 12 ноября 2011

В статье MDN цитируется спецификация Ecmascript 5, которой соответствует Firefox, но не все браузеры соответствуют ей таким образом, т. Е. Все браузеры не соответствуют Ecmascript 5.

1 голос
/ 12 ноября 2011

Вы не можете полагаться на то, что они работают во всех браузерах / реализациях, если они не заключены в кавычки.

Я бы попытался изменить их на что-то вроде «ввода» и «вывода», если это имеет смысл.Дополнительное предложение, которое вы должны будете добавить в документацию о том, что "в" нужны кавычки, вероятно, не стоит того, чтобы иметь "идеальные" имена идентификаторов.

1 голос
/ 12 ноября 2011

Хотя большинство браузеров не выдают ошибку при a.import, это не является строго законным.Если вы хотите использовать зарезервированное слово, вы должны заключить его в кавычки.

Посетите http://wwwjslint.com, и вставьте следующий код:

var d = {
    'in': 1
};

Этот код действителен.Однако, когда вы удаляете кавычки, генерируется ошибка:

Проблема в строке 2, символ 5. Ожидается идентификатор, и вместо этого он видит «в» (зарезервированное слово).

...