13

我真的很喜欢 ES6 生成器。有没有办法可以检测浏览器中的生成器支持?我知道生成器目前可能不在很多浏览器中(或者可能根本没有浏览器),但这对于我的目的来说是可以的。

我试过了:

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

但这似乎不起作用。

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

4

2 回答 2

17

eval实际上是正确解决方案的少数几次之一。

对于语言结构的改变,你需要这样的东西:

try {
  eval("(function *(){})");
} catch(err) {
  console.log(err);
  console.log("No generators");
}
于 2014-04-15T23:07:27.880 回答
5

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()您可以做到这一点。

于 2014-07-26T00:37:52.060 回答