Использование функции обнаружения для проверки поддержки зарезервированных слов с помощью точечной нотации
Я работаю над сайтом, где нам все еще нужно поддерживать IE8, и мы пытаемся включить виджет кнопки "Поделиться" в Twitter.
В IE8 мы видим ошибку "Ожидаемый идентификатор". Это кажется распространенной проблемой, и посты, подобные следующим, объясняют это полностью и хорошо:
- Twitter widgets.js выдает ошибку JavaScript "Ожидаемый идентификатор" в IE8
- Кнопка Twitter, вызывающая ошибку JS в IE8 (ожидаемый идентификатор)
По сути, Twitter прекратил поддержку IE8 (хотелось бы, чтобы я делал то же самое;)), но что более важно, ошибка вызвана тем фактом, что файл Twitter widgets.js ссылается на свойство с именем delete
через точечную нотацию (это то, что первый SO-пост, на который я ссылался выше, так или иначе)
Основываясь на 2 вышеприведенных сообщениях SO, есть 2 обходных пути - либо возьмите копию widgets.js и измените имя свойства с delete
к чему-то еще; или используйте условный комментарий, чтобы предотвратить его загрузку в IE8
Мне не нравится идея взять копию (и сохранить ее навсегда!) Файла widgets.js, поэтому я стараюсь не допустить его загрузки в IE8. Но я не хочу использовать условные комментарии; Я хочу использовать функцию обнаружения.
Поэтому я пытаюсь написать следующее, которое я могу использовать, чтобы решить, вызывать ли код загрузки асинхронной библиотеки Twitter или нет:
NTJSLibrary.prototype.hostSupportsDeleteKeywordAsPropertyName = function hostSupportsDeleteKeywordAsPropertyName() {
var testObj = {"delete":true};
try {
return testObj.delete;
}
catch (e) {
// Host does not support referencing a property named 'delete' and has thrown an exception
return false;
}
};
К сожалению, это не работает, потому что IE8 выбрасывает SCRIPT1010
ошибка, которая является ошибкой компиляции / интерпретации, а не ошибкой во время выполнения. IE не выдает исключение, потому что он не запускается!
Кто-нибудь знает, как я могу написать функцию обнаружения функции, чтобы обнаружить, ссылается ли зарезервированное слово delete
через точечную запись вызовет ошибку компиляции / интерпретации?
1 ответ
Причина, по которой вы не можете просто проверить это с помощью оператора try-catch, заключается в том, что синтаксические ошибки являются "ранними ошибками" в JavaScript, что означает, что ошибка выдается немедленно, даже не пытаясь выполнить код. (См. Какие типы ошибок отлавливаются операторами try-catch в Javascript? Для более подробного объяснения.)
Чтобы обойти это, мы должны использовать какой-то способ динамического создания кода, который позволит избежать этой проблемы. В JavaScript вы можете сделать это, используя new Function
или же eval
(в этом случае, используя eval
допустимо, так как мы не выполняем пользовательский код, и нет реального способа его использования).
Примером теста может быть что-то вроде этого:
function testReservedWords() {
try {
new Function('a.delete');
return true;
} catch (e) {
return false;
}
}