Javascript 如何检测ES6发电机的功能?

Javascript 如何检测ES6发电机的功能?,javascript,browser,generator,ecmascript-harmony,browser-feature-detection,Javascript,Browser,Generator,Ecmascript Harmony,Browser Feature Detection,我真的很喜欢ES6发电机。是否有一种方法可以检测浏览器中的生成器支持?我知道生成器目前可能不在很多浏览器中(或者可能根本没有浏览器),但这对我来说没关系 我试过: try { function *(){} } catch(err) { console.log("No generators"); } 但它似乎不起作用 如何在浏览器中检测对ES6生成器的支持?少数情况下,eval实际上是正确的解决方案之一 对于语言构造更改,您需要以下内容: try { eval("(function

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

我试过:

try {
  function *(){}
} catch(err) {
  console.log("No generators");
}
但它似乎不起作用


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

少数情况下,
eval
实际上是正确的解决方案之一

对于语言构造更改,您需要以下内容:

try {
  eval("(function *(){})");
} catch(err) {
  console.log(err);
  console.log("No generators");
}
function isCanvasSupported(){
  var elem = document.createElement('canvas');
  return !!(elem.getContext && elem.getContext('2d'));
}

Jeremy很好地解释了如何测试生成器支持。您需要使用eval:

isGeneratorSupported = function(){
    try {
       eval("(function*(){})()");
       return true;
    } catch(err){
       return false;
    }
}
alert( isGeneratorSupported() );
我会尽力解释为什么你的方法行不通

当您检查是否支持某些JS/html5功能时,您会使用以下内容:

try {
  eval("(function *(){})");
} catch(err) {
  console.log(err);
  console.log("No generators");
}
function isCanvasSupported(){
  var elem = document.createElement('canvas');
  return !!(elem.getContext && elem.getContext('2d'));
}
JS引擎解析您的代码,如果正确解析,则运行它,然后将输出与您期望的结果进行比较,只有这样,您的函数才能判断您的功能是否受支持

当您编写像
function*(){}
JS这样的代码时,引擎在第一步(解析代码)失败,甚至不尝试执行它。这是因为
*
不是一个新函数,它是一个新的语言构造,旧版本的JS引擎只会抛出一个
语法错误。同样的方法,如果您将编写
函数f(x,…y){}
函数f(x,y=1){}
,甚至只编写
]
。它们在当前JS中都是无效的构造(但其中2个在ES6中有效,谁知道在某些ES10中,
]
可能有效。)


绕过它的方法是让引擎以某种方式尝试执行它。通过将代码放入
eval()
中,您可以做到这一点。

谢谢@jeremy!在Firefox(目前支持生成器)中测试后,我做了一个小改动。仅仅拥有一个生成器表达式将“SyntaxError:function语句需要一个名称”,所以我添加了一个iLife。@Mikemacana我将事情放回引号中。对于不支持语法的旧浏览器,您确实需要将其作为字符串。无需在eval字符串中实际应用生成器。使用eval很容易,但检测它会有什么用处?您可以使用库。那么,如果内容安全策略禁止使用
“safe-eval”
,如何使其工作,比如在加速移动页面中?