4

方法は次のとおりです。

window私は最近、標準の問題として、プロパティまたは再帰サブプロパティとして、を実行するために必要なすべての関数と変数を含む単一のグローバルに利用可能な (つまり、それ自体が のプロパティである) オブジェクトを維持する webapp プロジェクトに参加しました。アプリケーション — すべてのウィジェットのステートフル インジケーター、初期化エイリアス、一般的な DOM 操作メソッドなど、すべて. 簡略化した疑似コードで説明しようと思いますが、それは私の懸念事項である、これがサイクロピーンであるという点に反しています。基本的に、カプセル化されているものは何もありません。単一の粒状コンポーネントはすべて、どこからでも読み取りまたは変更できます。

私が望む方法:

私の最近の仕事では、私は上級または唯一の Javascript 開発者だったので、目立たないコード ブロックのスコープを設定し、細かいプリミティブを変数として保持するために、関数を使用するスタイルで書くことができました。スコープ。このパターンを使用すると、デフォルトですべてがその実行スコープにロックされ、API を公開する必要がある場合に、慎重に選択されたいくつかの getter/setter 関数が返されることがあります。

…一般的なレベルでは、B は A よりもパフォーマンスが高いですか?

コードをスタイル A からスタイル B への機能的同等性にリファクタリングすることは膨大な作業であるため、私の主張に対して意味のある実用的なテストを行うことはできませんが、モノリシックな神オブジェクトのアンチパターンは、スコープ付きの機能的スタイルと比較して既知のパフォーマンス モンスターです。 ? 読みやすさ、コードの安全性、関心の分離のために、私は B を主張します...しかし、すべてを常にメモリに保持し、ルックアップチェーンをクロールするなどして、何かにアクセスするための本質的にパフォーマンスが集中する演習になると思います、または少なくともガベージコレクションを非常に困難なタスクにします。

4

1 に答える 1

2

考慮すべき点はほとんどありません。メモリを集中的に使用するプログラムが必ずしも遅くなるとは限りません。

また、自己実行関数を使用し、いくつかの関数のみを公開する場合でも、公開された関数が必要とする可能性があるため、関数の残りの部分はメモリに保持されます。クロージャによるメモリ リークが、今 Web で大きな話題になっています。

また、v8 の動作方法を想定すると、JavaScript コードは C++ にコンパイルされてからアセンブリされます。現在、頻繁に使用される関数はホット コードになり、キャッシュされた同じバージョンの関数が何度も何度も使用されます。オブジェクトにも同様のことが当てはまります。

ただし、後でオブジェクトを編集すると、オブジェクトが再コンパイルされ、パフォーマンスが低下します。

Try..Catch ブロックを使用すると、効率的にコンパイルできません。ただし、Try...Catch ブロック内のコードを関数にラップすると、それが役立ちます。

したがって、パフォーマンスを高速化するための最も重要なタスクは、ほとんど静的なものを関数として記述することです。また、定義済みのオブジェクトを複数回変更しないでください。

コードを自己実行関数でラップしても、メモリに保持されているため、おそらくあまり役​​に立ちません。ただし、追加の関数定義は別の方法でコンパイルされる場合があります。それでもラップされた関数なので、ほとんど違いはないはずです。

于 2013-02-19T16:04:51.973 に答える