我读到了 JavaScript 中的 yield 关键字,需要在我的项目中使用它。我读到这个关键字是从某个版本的 JS 开始实现的,因此我认为旧版浏览器不支持它(是吗?)。
有没有办法检查是否支持 yield 关键字?或者至少有没有办法检查 JS 的版本是否大于或等于实现该关键字的版本(1.7)?
我读到了 JavaScript 中的 yield 关键字,需要在我的项目中使用它。我读到这个关键字是从某个版本的 JS 开始实现的,因此我认为旧版浏览器不支持它(是吗?)。
有没有办法检查是否支持 yield 关键字?或者至少有没有办法检查 JS 的版本是否大于或等于实现该关键字的版本(1.7)?
这是一个检查是否可以使用yield的函数。
var can_yield = (function(){
try {
return eval("!!Function('yield true;')().next()");
}
catch(e) {
return false;
}
})();
yield
引入了一种新的 JavaScript 语法。除非在 script type
属性中指定了版本号,否则您将无法使用 yield
。
当您指定一个脚本版本时,只有支持该版本的浏览器才会执行代码块。因此,在以下代码中,只有 Firefox 而不是 IE、Opera 或 WebKit 会执行顶部的代码块:
<script type="text/javascript;version=1.7">
function x() {
yield 0;
}
var canyield= true;
</script>
<script type="text/javascript">
if (!window.canyield) {
// do some fallback for other browsers
}
</script>
(*:请注意,type
属性中指定的类型和版本独占地确定了外部脚本的获取、执行和执行模式。遗憾的是,脚本的 Content-Type
将完全被忽略。)
yield
。但在Firefox中表现很好。 - John McDonaldyield
支持。var canYield = (function(){try{yield;}catch(e){}}())!==undefined;
Modernizr测试
define(['Modernizr'], function( Modernizr ) {
// native yield support.
Modernizr.addTest('yield', (function(){try{yield;}catch(e){}}())!==undefined);
});
Performance http://jsperf.com/yield-support
yield
。 - hippietrailyield
,bobince并不完全正确,但即使在开启实验性JavaScript标志的情况下(chrome://flags/#enable-javascript-harmony),Chrome 31也不会将JavaScript版本解释为1.7块。由于Chrome 31和Firefox之间的实现差异,Tymon Sturgeon的方法无法在开启实验性JS的Chrome 31中检测到yield
,尽管它非常接近。通过几个修改,可以检测到Firefox和Chrome 31在开启实验性JS时是否存在yield
。yield
的区别(为了清晰起见,我将其写成长篇小说):var fooGen = function(){ yield 1; yield 2; };
var iterator = fooGen();
console.log(iterator.next()); // prints 1
console.log(iterator.next()); // prints 2
// Note the *
var fooGen = function*(){ yield 1; yield 2; };
var iterator = fooGen();
console.log(iterator.next().value); // prints 1
console.log(iterator.next().value); // prints 2
.value
在Chrome中是必需的,因为它会产生一个对象,但更重要的是,生成器函数定义中需要使用“*”符号。此外,在Chrome中无法从大写字母“F”的Function中创建生成器:new Function('', '{yield 5;}');
。如果您知道如何做,请在下面留言。
为了正确检测Firefox和Chrome中的yield
,我使用了一些代码进行了反复测试:
<script type="application/javascript">
var can_yield = (function(){
try {
// Assuming Chrome's generator syntax
var funcUsingYield = new Function('', '{ var interp = function* generator(){ yield true; }}');
return true;
} catch(e) {
return false;
}
})();
</script>
<script type="application/javascript;version=1.7">
// Redefine the `can_yield` function inside a JS1.7 block. Probably safe to simply return true
can_yield = (function(){
try {
return eval("!!Function('yield true;')().next()");
}
catch(e) {
return false;
}
})();
</script>
<script type="application/javascript">
if(!can_yield)
{
alert("Can't Yield!");
}
</script>
测试过的浏览器版本:
yield
yield
yield
yield
实际上,有一些技巧可以使用,但我怀疑这些技巧是否具有真正的价值。
(function test_key_word(keyword){
var wrong = false;
try {
eval(keyword + "=42");
}
catch(e) {
wrong = true;
} finally {
if (wrong) { return "definitely wrong" }
else
if (window[keyword] !== 42) {
return "very probably, wrong"
}
else {
return "can be acceptable, but nevertheless i wouldn't rely upon such tests"
}
}})("in")