如何检测ES6发生器?

时间:2014-04-15 23:00:23

标签: javascript browser generator ecmascript-harmony browser-feature-detection

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

我试过了:

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

但它似乎不起作用。

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

2 个答案:

答案 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()中,您可以执行此操作。