如何进行ES6生成器的特性检测?

13

我非常喜欢ES6生成器。有没有办法检测浏览器是否支持生成器?我知道当前可能没有很多浏览器(或者可能根本没有浏览器)支持生成器,但这对我的目的来说没问题。

我尝试过:

try {
  function *(){}
} catch(err) {
  console.log("No generators");
}

但它似乎不起作用。

如何在浏览器中检测对ES6生成器的支持?


1
使用eval很容易,但如何检测它会有什么用处呢? - Andreas Rossberg
你可以使用feature-detect-es6库。 - Lloyd
2个回答

17

在很少数情况下,eval 实际上是正确的解决方案。

对于语言结构的更改,您需要像这样的东西:

try {
  eval("(function *(){})");
} catch(err) {
  console.log(err);
  console.log("No generators");
}

感谢@jeremy!在Firefox中测试后,我做了一个小改动(它目前支持生成器)。仅有一个生成器表达式会导致“SyntaxError:函数语句需要名称”,因此我添加了一个IIFE。 - mikemaccana
@mikemaccana 我把东西放回引号里。对于不支持语法的旧浏览器,您需要将其作为字符串使用。 - Jeremy J Starcher
不需要实际应用生成器在 eval 字符串中。 - Andreas Rossberg

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中无效的结构(但其中有2个在ES6中是有效的,而谁知道也许]在某些ES10中是有效的)。
绕过这种情况的方法是要求你的引擎以某种方式尝试执行它。通过将你的代码放在eval()中,你可以做到这一点。

2
如果像在加速移动页面(Accelerated Mobile Pages)中一样,Content Security Policy禁止了'unsafe-eval',那么该如何使其正常工作呢? - Damian Yerrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接