Подтвердить что ты не робот

Поддержка результатов проверки Javascript

Я читал о ключевом слове yield в JavaScript, и мне нужно использовать его в моем проекте. Я прочитал, что это ключевое слово было реализовано, начиная с определенной версии JS, поэтому я думаю, что старые браузеры не поддерживают его (правда?).

Есть ли способ проверить, поддерживается ли ключевое слово yield? или, по крайней мере, есть способ проверить, больше ли версия JS или равна той, которая реализует это ключевое слово (1.7)?

4b9b3361

Ответ 1

Здесь используется функция проверки возможности использования урока.

var can_yield = (function(){ 
    try { 
        return eval("!!Function('yield true;')().next()"); 
    } 
    catch(e) { 
        return false; 
    } 
})();

Ответ 2

yield вводит новый синтаксис JavaScript. Вы не сможете использовать yield, если вы не указали, что хотите новый синтаксис JavaScript, включив номер версии в атрибут script type (*).

Когда вы укажете версию script, только браузеры, поддерживающие данную версию, будут выполнять блок вообще. Таким образом, только 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 script, к сожалению, полностью игнорируются.)

Ответ 3

Здесь я беру проверку на встроенную поддержку yield.

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);
});

Производительность http://jsperf.com/yield-support enter image description hereenter image description here

Ответ 4

Строго говоря, только браузеры Mozilla поддерживают JavaScript. Все браузеры должны поддерживать ECMAScript, а более старые версии JavaScript - это реализация ECMAScript.

Этот сайт показывает, какие версии Javascript поддерживаются в версиях браузера.

MSIE использует JScript. В JScript нет урона. Поэтому использование урожая ограничит поддержку браузера вашей страницы.

Попробуйте https://developer.mozilla.org/en/New_in_JavaScript_1.7 для получения информации об использовании JavaScript 1.7

Ответ 5

Я провел много времени с yield в последнее время, а bobince не совсем ошибается, но Chrome 31 не интерпретирует версию JavaScript до 1,7 блоков, даже с включенным флагом Experimental JavaScript (chrome://flags/# включить-JavaScript-гармонии). Из-за различий в реализации между Chrome 31 и Firefox метод Tymon Sturgeon не может обнаружить yield в Chrome 31 с экспериментальным JS, хотя он очень близок. С некоторыми изменениями он может обнаружить существование yield для Firefox и Chrome 31 с экспериментальным 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 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 с экспериментальным JS Вкл: yield работает
  • Chrome 31 с экспериментальным JS Выкл: yield не работает
  • и IE10: yield не работает

Ответ 6

мы фактически реализовали "выход", программно, в "чистом javascript", то есть БЕЗ ИСПОЛЬЗОВАНИЯ "выхода" FIREFOX для пижамы, отметив, что скульптура также сделала то же самое.

в теории, то же самое можно было бы сделать либо вручную (т.е. с помощью ручного кодирования переведенной функции, следуя правилам о том, как превратить функцию в генератор) или путем запуска javascript через javascript-to-javascript переводчик языка (!)

то, что требуется для реализации такого "Зверя", состоит в том, что вы должны сделать функцию, способную пропустить до такой степени, что она была последней "вышла" (по инструкции yield). таким образом, все переменные должны быть сохранены во временном состоянии (!) и соответствующим образом изменено выполнение кода, чтобы принять эту временную информацию состояния. который включает в себя инструкции, для циклов, а также для операторов "if".

это можно сделать...

... но это просто сука работы: вам нужно эффективно писать весь компилятор, который анализирует любую javascript-программу, затем "преобразует" ее, а затем выводит измененный javascript.

. Л

Ответ 7

whell, на самом деле есть некоторые методы, которые вы можете использовать, но я сомневаюсь, что такие методы имеют реальную ценность

(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")