Я провел много времени с yield
в последнее время, и bobince не совсем ошибается, но Chrome 31 не интерпретирует версию JavaScript в 1,7 блока, даже с включенным флагом экспериментального JavaScript (chrome: // flags / # включить-JavaScript-гармонии). Из-за различий в реализации между Chrome 31 и Firefox метод Tymon Sturgeon не может обнаружить yield
в Chrome 31 при включенном Experimental JS, хотя он очень близок. С помощью нескольких модификаций он может обнаружить наличие yield
для Firefox и Chrome 31 с включенным Experimental JS.
Сначала я быстро расскажу о yield
различиях (напишу это для ясности):
В Firefox:
var fooGen = function(){ yield 1; yield 2; };
var iterator = fooGen();
console.log(iterator.next()); // prints 1
console.log(iterator.next()); // prints 2
В Chrome 31 с включенным экспериментальным JavaScript:
// 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, потому что он дает объект, но, что более важно, генератор требует "*" в определении функции. Также я не смог найти способ создать генератор из заглавной буквы "F" Функция: new Function('', '{yield 5;}');
в Chrome. Если вы знаете как, оставьте комментарий ниже.
Чтобы правильно определить yield
в Firefox и Chrome, я использовал немного кода с некоторыми перемотками вперед и назад:
<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>
Проверено в:
- Firefox 25 :
yield
работает
- Chrome 31 с Experimental JS Вкл. :
yield
работает
- Chrome 31 с Experimental JS Выкл. :
yield
не работает
- и IE10 :
yield
не работает