13

私はES6ジェネレーターを本当に楽しんでいます。ブラウザーでジェネレーターのサポートを検出する方法はありますか? 現時点では、ジェネレーターが多くのブラウザーに含まれていない (またはブラウザーがまったくない可能性がある) 可能性があることはわかっていますが、それは私の目的には問題ありません。

私は試した:

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

しかし、うまくいかないようです。

ブラウザーで ES6 ジェネレーターのサポートを検出するにはどうすればよいですか?

4

2 に答える 2

17

evalそれが実際に正しい解決策である数少ない例の 1 つです。

言語構造の変更には、次のようなものが必要です。

try {
  eval("(function *(){})");
} catch(err) {
  console.log(err);
  console.log("No generators");
}
于 2014-04-15T23:07:27.880 に答える
5

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()することで、これを行うことができます。

于 2014-07-26T00:37:52.060 に答える