Jeremy は、ジェネレーターのサポートをテストする方法をうまく説明しました。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 エンジンはコードを解析し、適切に解析されている場合は実行し、出力を期待したものと比較します。これにより、関数は機能がサポートされていることを知ることができます。
JSエンジンのようなコードを書くと、function *(){}
最初のステップ(コードの解析)で失敗し、実行しようとさえしません。これは*
、 が新しい関数ではなく、新しい言語構造であり、古いバージョンの JS エンジンが単にsyntaxError
. 、function f(x, ...y) {}
またはfunction f(x, y=1){}
単に]
. それらはすべて現在の JS では無効な構造です (ただし、そのうちの 2 つは ES6 で]
有効であり、一部の ES10 で有効になる可能性があることは誰にもわかりません)。
それをバイパスする方法は、エンジンに何らかの方法で実行を試みるように依頼することです。コードを内部に配置eval()
することで、これを行うことができます。