我真的很喜欢 ES6 生成器。有没有办法可以检测浏览器中的生成器支持?我知道生成器目前可能不在很多浏览器中(或者可能根本没有浏览器),但这对于我的目的来说是可以的。
我试过了:
try {
function *(){}
} catch(err) {
console.log("No generators");
}
但这似乎不起作用。
如何检测浏览器中对 ES6 生成器的支持?
我真的很喜欢 ES6 生成器。有没有办法可以检测浏览器中的生成器支持?我知道生成器目前可能不在很多浏览器中(或者可能根本没有浏览器),但这对于我的目的来说是可以的。
我试过了:
try {
function *(){}
} catch(err) {
console.log("No generators");
}
但这似乎不起作用。
如何检测浏览器中对 ES6 生成器的支持?
eval
实际上是正确解决方案的少数几次之一。
对于语言结构的改变,你需要这样的东西:
try {
eval("(function *(){})");
} catch(err) {
console.log(err);
console.log("No generators");
}
Jeremy 很好地解释了如何测试生成器支持。您需要使用评估:
isGeneratorSupported = function(){
try {
eval("(function*(){})()");
return true;
} catch(err){
return false;
}
}
alert( isGeneratorSupported() );
我将尝试解释为什么您的方式不起作用。
当您检查是否支持某些 JS/html5 功能并使用以下内容时:
function isCanvasSupported(){
var elem = document.createElement('canvas');
return !!(elem.getContext && elem.getContext('2d'));
}
JS 引擎解析您的代码,如果正确解析,则运行它,然后将输出与您的预期进行比较,只有这样,您的函数才能判断您的功能是否受支持。
当您编写像function *(){}
JS 引擎这样的代码时,第一步(解析您的代码)失败,甚至不尝试执行它。发生这种情况是因为*
它不是一个新功能,它是一种新的语言结构,旧版本的 JS 引擎只会抛出一个syntaxError
. 如果你会用同样的方式写function f(x, ...y) {}
,function f(x, y=1){}
甚至只是]
。它们在当前的 JS 中都是无效的构造(但其中 2 个在 ES6 中有效,谁知道也许]
在某些 ES10 中有效。)
绕过它的方法是让你的引擎以某种方式尝试执行它。通过将代码放入其中,eval()
您可以做到这一点。