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

Я работаю над сайтом, где нам все еще нужно поддерживать IE8, и мы пытаемся включить виджет кнопки "Поделиться" в Twitter.

В 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;
  }
}
Другие вопросы по тегам