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