2

私は上手になろうとしています、私は本当にそうですが、それを行う方法がわかりません:)

ここでグローバルを使用しない方法についてのアドバイスは大歓迎です。グローバルを G としましょう。

Function A 
  Builds G by AJAX

Function B
  Uses G

Function C
  Calls B
  Called by numerous event handlers attached to DOM elements (type 1)

Function D
  Calls B
  Called by numerous event handlers attached to DOM elements (type 2)

ここでグローバルを使用して回避する方法がわかりません。DOM 要素 (タイプ 1 & 2) は、A と接続されていない他の関数 (E&F) で作成されます。各イベント ハンドラーに G を追加したくありません (イベント ハンドラーが大きく、これらのイベント ハンドラーがたくさんあるため)。そのため、ここで求めているのと同じ種類のソリューションが必要になります (つまり、G を E&F に移動する)。

グローバル G、BTW は、他の要素を構築するために必要な配列であり、それらは AJAX によって構築されます。

シングルトンが本当の解決策であるとは確信していません。

ありがとう。

4

5 に答える 5

6

もちろん、すべてをすぐに実行できる 1 つの大きな関数にまとめてください。

(function() {
    // Your code goes here
})(); // Called right away

そこには何でも入れることができ、より狭い範囲で何でもアクセスできますが、それでもグローバルにはなりません。

また、あなたのファイルが唯一のファイルである場合は、ある種の再利用可能なコンポーネントを作成していない限り、実際には害がないため、グローバルを避けるのをやめてください。

于 2012-04-12T23:12:04.827 に答える
2

イベントで G をパスする心配はありません。コピーではなく、実際のオブジェクトへの単なる参照であるため、メモリの問題は発生しません。関数、オブジェクト、および配列は参照として渡されます。

于 2012-04-12T23:25:20.147 に答える
2

これがオプションかどうかわかりませんか?

Function Everything() {
  var G

  Function A 
    Builds G by AJAX

  Function B
    Uses G

  Function C
    Calls B
    Called by numerous event handlers attached to DOM elements (type 1)

  Function D
    Calls B
    Called by numerous event handlers attached to DOM elements (type 2)
}();
于 2012-04-12T23:11:56.803 に答える
1

最良の代替手段が何であるかを知るための多くの情報を提供していませんが、一般的な種類のオプションをいくつか示します。

関数の引数として渡される Ajax の結果

Function A() { 
  Builds G by AJAX
  B(G)
}

Function B(g) {
  Uses g
}

G のタイミングは、A の成功ハンドラーがとにかく呼び出されるまで使用できないようなものであるため、おそらくパラメーターとして B に渡すだけで、グローバルとしては必要ありません。

オンデマンドで取得される DOM 要素

DOM 要素の場合、通常、DOM 要素の参照を JavaScript 変数に格納する必要はありません。それらに適切な ID を与えると、必要に応じていつでも必要に応じて取得できますdocument.getElementById("idName")

多数のイベントや関数で使用できる永続変数が本当に必要な場合は、次の 2 つのオプションがあります。

グローバルなしで永続データを共有するための自己実行機能の閉鎖

それらを自己実行関数クロージャー内に格納できます。

(function() {

var G = [];

Function A 
  Builds G by AJAX

Function B
  Uses G

})();

単一のグローバル オブジェクト

他のデータをプロパティとして保存する単一の真のグローバルを作成します。

var myMainGlobal = {};

myMainGlobal.G = [];
myMainGlobal.A = function() {
  Builds myMainGlobal.G by AJAX
}

myMainGlobal.B = function() {
  Uses myMainGlobal.G
}

これにより、少なくとも 1 つの実際の最上位グローバル シンボルのみが作成され、必要なだけのグローバル データを保持できます。

于 2012-04-12T23:52:41.067 に答える