2013-04-22 2 views
1

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

+5

Я бы просто пошел [здесь] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Reserved_Words), захватить все зарезервированные слова, положить их в массив и проверить строку. – elclanrs

+0

В чем смысл этого вопроса? Вы динамически создаете имена переменных или просто хотите убедиться, что при кодировании вы случайно не используете зарезервированное слово (в этом случае, используя IDE или что-то вроде Notepad ++). Или используйте jsLint для проверки этого stff. –

ответ

4

Одним из вариантов было бы сделать:

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

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

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

+2

Это потенциальное целое для безопасности. – SLaks

+1

Это хороший момент, но в зависимости от контекста это может быть не проблема. Я думаю, что решение просто получить полный список лучше, но ОП спросил, как вы это сделаете, поэтому я понял, что я бы ответил. – Jonah

+0

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

1

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

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

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

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

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

+1

Нет необходимости в этом объекте. Массив должен делать, если значение существует в массиве, тогда это зарезервированное слово. 'return !! ~ reservedWords.indexOf (str);' – elclanrs

+0

Хорошая точка, обновленный ответ. – Reason

+1

Почему бы просто не вернуть returnWords.indexOf (str)> -1; '? – jbabey

Смежные вопросы