我真的很喜欢ES6发电机。有没有办法在浏览器中检测生成器支持?我知道目前生成器可能不在很多浏览器中(或者可能根本没有浏览器),但这对我的目的来说是可行的。
我试过了:
try {
function *(){}
} catch(err) {
console.log("No generators");
}
但它似乎不起作用。
如何在浏览器中检测对ES6生成器的支持?
答案 0 :(得分:17)
eval
实际上是正确解决方案的次数之一。
对于语言构造的更改,您需要这样的内容:
try {
eval("(function *(){})");
} catch(err) {
console.log(err);
console.log("No generators");
}
答案 1 :(得分:5)
Jeremy很好地解释了如何测试发电机支持。你需要使用eval:
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中的无效结构(但其中有两个在ES6中有效,谁知道]
可能在某些ES10中有效。)
绕过它的方法是让你的引擎以某种方式尝试执行它。通过将代码放在eval()
中,您可以执行此操作。