質問: new Foo({ bar: new Bar({ x: function(){ doStuff(foo); } }); }); ``` (これが馴染んでいれば、以前はExtJSを使用していたかもしれません - これはほとんどのものがビルドされている方法です)。 `foo.bar.x()`を呼び出すと、バー( `bar` )を所有するFoo( `foo` )それが関数( `x` )を呼び出しています。これはうまくいきますが、私のEclipseは "fooが初期化されていないかもしれない"と警告し、 `doStuff();` の呼び出しを参照しています。 `foo` をまだ定義していません。もちろん、 `foo` が正常に構築されない限り、 `x()`を呼び出すことはできませんが、私のスタイルチェッカーは明らかにそれを理解していません。 だから私はこれに対処する方法を失っている。私は警告を無視すべきですか?それをそのようにマークする方法はありますか?私はもはや警告を受けませんか?私はこれを間違っているのですか?私は別の方法で私の参照を渡す必要がありますか?
回答: まず、Fooが構築されます。そのコンストラクターに、新しいBarが渡され、変数fooを使用する関数が渡されます。 しかし、fooは、Fooのコンストラクタが終了した後にのみ値が割り当てられます。その時点で、宣言されていない変数fooを使用して関数がすでに宣言されています。 関数がBarまたはFooのコンストラクターで使用されている場合、関数は失敗します。