0

* 免責事項: これが良い考えだと言っているわけではありません - 実際問題として、そうではないとはっきり言います - したがって、この質問は、コーディング スタイルにとってイベント ループが正確に何を意味するのかを理解しようとするものです。

javascript-has-no-threads マントラに関する私の初歩的な理解は、ランタイムがすべての javascript を短い「コードのブロック」として扱い、実行中にブロックから移動することなく次々に実行されるようにスケジュールされているということです。この場合のコード ブロック (実際の用語はわかりません) は、基本的に、イベント ハンドラーがトリガーされた結果として実行されるコードです。

私の理解が正しければ、グローバル変数の使用が複数の「コードブロック」にまたがらない場合、グローバル変数を使用することは技術的に100%安全であることを意味します。

したがって、たとえば、単一のグローバル オブジェクトがある場合window.workspace、イベント ハンドラーとそこから流れるすべてのコードを、一時変数をクロージャーに格納するのではなく、すべて に格納できますwindow.workspace。ワークスペースがイベント ハンドラー (同じものであっても) の呼び出しの間に状態を保持すると想定しない限り、これは完全に安全なはずです。

これは正確ですか(ただし、繰り返しになりますが、お勧めしません)

4

1 に答える 1

2

JavaScriptイベントメカニズムがどのように機能するかは、JavaScriptが実行されるコンテナ次第です。イベントハンドラーが常にある種の永続的な状態オブジェクトを各呼び出しで渡されるシステムをセットアップすることは可能です。

ただし、Node.jsのようなブラウザーやシステムでは、(私が理解している範囲で)あなたの質問に対する答えは保護された「はい」または「はいしかし」です。

JavaScriptにはクロージャがあるため、永続的(DB永続性とは異なり、イベントハンドラーの呼び出し全体で永続的であることを意味します)を確保するためのよりクリーンな方法ですが、プライベートストレージは次のようなことを行います。

(function(global) {
  var persistentValue = 12;

  // set up an event handler
  global.whatever().handleEvent(function() {
    if (persistentValue > 12) { ... }
    else { persistentValue ++; }
  });

})( this );

「persistentValue」変数はイベントハンドラーの周りのクロージャーで「生きている」ままであるため、呼び出されるたびに、最後に実行されたときと同じようにその変数が表示されます。もちろん、他のイベントハンドラーが同じラッパー関数で作成されている場合は、それらも変数にアクセスできます。その意味で、それはそれらのハンドラーにとって比較的グローバルな変数のようなものです。

于 2012-07-11T17:12:12.087 に答える