JavaScript - пакет является зарезервированным ключевым словом

Я пытаюсь минимизировать стороннюю библиотеку JavaScript с помощью Google Closure Compiler, но она выдает ошибку в строке ниже:

inBlock.package = package = name

Ошибка

ОШИБКА - Ошибка разбора. пропущенное имя после. Оператор **

name выше является локальной переменной внутри функции, а inBlock является входным аргументом. Нигде в функции не объявлено package, кроме этой строки ошибки.

Я думаю, это может быть связано с тем, что package является зарезервированным ключевым словом в JavaScript? Любая идея, что пакет в JavaScript и как это исправить?

Ответ 1

Вы правы, package является зарезервированным словом в JavaScript (но только в строгом режиме, и именно поэтому код работает в некоторых местах).

package зарезервирован будущим, что означает, что он не используется ни для чего, но вы не можете использовать его для обозначения переменных. Однако (если вы действительно должны), вы можете использовать его для обозначения ключей в таких объектах:

inBlock['package'] = name;  // this is ok

Пока вы используете строку. Вы не можете этого сделать:

inBlock.package = name;  // this is not ok

Я бы сказал, что вам лучше называть его чем-то другим.

Ответ 2

Согласно MDN, package находится в категории "зарезервировано для будущего". В зависимости от того, какую версию браузера вы используете, и находится ли ваш код в строгом режиме, вы можете или не можете использовать эти слова в качестве идентификаторов. Другими словами, вы должны избегать их, чтобы быть в безопасности.

Вы можете безопасно использовать зарезервированные слова в качестве имен свойств, если используете этот синтаксис:

inBlock["package"] = something;

Но это не поможет вам с вашей переменной package. Можете ли вы переименовать его?

Ответ 3

"package" - это зарезервированное слово в ecmascript 3. ecmascript 5 уменьшил зарезервированное слово, сделав его доступным для браузера, который его реализовал, и снова представил его в режиме "строгого" режима ecmascript 5 (который должен быть основой будущего emcascript).

Экмаскрипт 5 также изменил ограничения на зарезервированные слова, в частности, вы можете использовать зарезервированные слова как имена свойств (независимо от режима), но не имена переменных.

В результате, если вы поместите Closure Compiler в режим EcmaScript 5, вы можете использовать "inBlock.package", и он не будет жаловаться, но если вы попытаетесь использовать его в старых версиях IE (8,7,6 я поверьте), он не сможет разобрать. Большинство других браузеров не следовали этой части спецификации и не затрагивались.

Ответ 4

package - это ключевое слово (из Java), зарезервированное для последующего использования в JavaScript. Решение? Назовите свою переменную чем-то еще:)

Если вы не можете изменить имя inBlock.package, используйте его вместо нотации:

inBlock['package']