Как определить поддержку функции async без eval?

Здесь один из способов определить, поддерживает ли текущий движок асинхронные функции:

const supportsAsyncFunctions = (() => {
  try {
    new Function('async () => {}')();
  } catch (error) {
    return false;
  }

  return true;
})();

Но есть ли способ сделать это, не используя eval или Function?

Ответ 1

Это можно сделать, но решение совсем не совсем и включает внешний script. script может установить флаг, или глобальный обработчик ошибок можно настроить для просмотра синтаксических ошибок при загрузке script.

Если script приводит к синтаксической ошибке, он по-прежнему считается загруженным, поэтому сетевые проблемы не могут вызывать ложные срабатывания:

Асинхр-detection.js

window.isAsyncAvailable = true;
async () => {};

main.js

new Promise(function (resolve, reject) {
  var script = document.createElement('script');
  document.body.appendChild(script);
  script.onload = resolve.bind(null, true);
  script.onerror = reject;
  script.async = true;
  script.src = 'async-detection.js';
})
.then(function () {
  console.log(window.isAsyncAvailable);
})
.catch(/* generic script loading error */);

Этот метод может использоваться для обнаружения синтаксических функций, используемых на веб-сайте, которые не могут быть заполнены или обычно пойманы с помощью try..catch. Особенно полезно надежно запускать Ваш браузер на последнем экране.