Как я могу распознать генераторы ES6?

Мне действительно нравятся генераторы ES6. Есть ли способ обнаружить поддержку генератора в браузерах? Я знаю, что генераторы могут быть не во многих браузерах (или вообще без браузеров), но это нормально для моих целей.

Я пробовал:

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

Но это не работает.

Как я могу обнаружить поддержку генераторов ES6 в браузерах?

Ответы

Ответ 1

Одно из немногих случаев, когда eval на самом деле является правильным решением.

Для изменений конструкции языка вам нужно что-то вроде этого:

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

Ответ 2

Джереми прекрасно объяснил, как тестировать поддержку генераторов. Вам нужно использовать 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 (но 2 из них действительны в ES6, и кто знает, может быть, ] будет действителен в некоторых ES10.)

Как обойти это, попросите свой движок как-то попытаться его выполнить. И, помещая ваш код внутри eval(), вы можете это сделать.