cal*_*lum 15 javascript async-await
这是检测当前引擎是否支持异步函数的一种方法:
const supportsAsyncFunctions = (() => {
try {
new Function('async () => {}')();
} catch (error) {
return false;
}
return true;
})();
Run Code Online (Sandbox Code Playgroud)
但有没有办法不使用eval
或Function
?
建议的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
.特别有用的是可靠地触发你的浏览器是它的最后一条腿唠叨屏幕.