如何在没有eval的情况下检测异步功能支持?

cal*_*lum 15 javascript async-await

这是检测当前引擎是否支持异步函数的一种方法:

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

  return true;
})();
Run Code Online (Sandbox Code Playgroud)

但有没有办法不使用evalFunction

Est*_*ask 8

建议的eval方法会给CSP错误带来漏报,因为它们不会被处理.如果这是一个问题,可以按照此答案中的说明处理CSP错误.

可以这样做,但解决方案根本不是很好,涉及外部脚本.脚本可以设置标志,或者可以设置全局错误处理程序以在加载脚本时监视语法错误.

如果脚本导致语法错误,它仍然被视为已加载,因此网络问题不会导致误报:

异步detection.js

window.isAsyncAvailable = true;
async () => {};
Run Code Online (Sandbox Code Playgroud)

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 */);
Run Code Online (Sandbox Code Playgroud)

此方法可用于检测网站上使用的语法功能,这些功能无法填充或通常被捕获try..catch.特别有用的是可靠地触发你的浏览器是它的最后一条腿唠叨屏幕.