Определите, является ли слово зарезервированным идентификатором Javascript

Возможно ли в Javascript определить, является ли определенная строка зарезервированным ключевым словом языка, например switch, if, function и т.д.? То, что я хотел бы сделать, - это экранирование зарезервированных идентификаторов в динамически сгенерированном коде способом, который не разбивается на расширения для браузера. Единственная мысль, которая приходит мне в голову, заключается в использовании eval в блоке try-catch и проверке синтаксической ошибки. Не знаю, как это сделать. Любые идеи?

Ответ 1

Один из вариантов:

var reservedWord = false;
try {
  eval('var ' + wordToCheck + ' = 1');
} catch {
  reservedWord = true;
}

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

Как указано в комментариях, это может представлять угрозу безопасности.

Ответ 2

Я думаю, вы могли бы решить это с помощью eval, но это похоже на хак. Я хотел бы просто проверить все зарезервированные слова. Что-то вроде этого:

var reservedWords = [
    'break',
    'case',
    ...
];

function isReservedWord(str) {
    return !!~reservedWords.indexOf(str);
}

Вот список всех зарезервированных слов: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Reserved_Words

Кроме того, проблема с eval-подхода заключается в том, что некоторые браузеры иногда позволяют использовать некоторые зарезервированные слова в качестве идентификаторов.