3

スクリプトがノードで実行されているか、ブラウザーで実行されているかを検出する方法の例を見ると、次のようなロジックが表示されます。

if (typeof module !== 'undefined' && module.exports) {
    // do something that applies to node
} else {
    // do something that applies to browser
}

ノードのドキュメントには、グローバルが であると記載moduleされています。これは、常に である必要があること{Object}を意味します。それはノードで常に正しいですか?そうでない場合は、次のような検出ロジックを実行する方が理にかなっています。typeof module"object"

if (typeof module === 'object' && module.exports) {
    // do something that applies to node
} else {
    // do something that applies to browser
}
4

2 に答える 2

4

はい、これまでのすべてのノードバージョンで、module常にオブジェクトであり、すべての0.xバージョンでそのように維持される可能性があります。それが未定義ではなく、具体的にオブジェクトであるかどうかをチェックすることが理にかなっているかどうかに関しては、ほとんどの場合、スタイルの問題です。前者の例では、コードはおそらく実際にはプロパティの追加にのみ関係しているため、コードmodule.exports化されているほど表現力が高く、脆弱性が低くなります。たとえば、ノードの将来のバージョンでは、おそらくmodule関数になります。その場合、前者の例は引き続き機能しますが、後者の例では小さな変更が必要です。

于 2012-08-10T21:14:55.667 に答える
3

その2番目のスニペットはおそらく正常に機能します。しかし、いいえ、それ以上の意味はないと思います。あなたはそれが何であるかを気にするよりも、それが存在することをはるかに気にします。そして、javascriptに存在するかどうかをチェックする標準的な方法は次のとおりです。

typeof myVar !== 'undefined'

そのため、ここではJSの慣習が少し機能しています。

于 2012-08-10T21:14:43.823 に答える