我可以在浏览器中检测到 async/await 可用吗?

Can I detect async/await available in browser?

如题,如何检测浏览器对async/await es7的支持?

这可能吗?

目前还没有完美的解决方案,但可以使用 eval:

let isAsyncSupported;

try {
  isAsyncSupported = eval(`typeof Object.getPrototypeOf(async function() {}).constructor === 'function'`);
} catch (exception) {
  isAsyncSupported = false;
}

更多请看:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncFunction

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

与任何其他句法特征一样,应该对其进行评估以便检测。由于可以限制 eval,因此在启用 CSP 时这可能是不可能的:

let isAsync = true;

try {
  eval('async () => {}');
} catch (e) {
  if (e instanceof SyntaxError)
    isAsync = false;
  else
    throw e; // throws CSP error
}

如果目标浏览器有可能不支持某项功能,则应转译代码。

避免 CSP 对 eval 的限制的替代方法是使用外部脚本来检测句法特征,