通常、ready
イベントjQuery関数はこのように呼び出されます
$(function() { /* ... */ });
// or
jQuery(function() { /* ... */ });
// or
jQuery(document).ready(function() { /* ... */ });
要するに、関数には特定のコンテキストが与えられていません。jQuery によって関数に与えられる実際のコンテキストHTMLDocument
は、引数に関係なく要素です (最後の例ではdocument
)。なぜこれがそうなのかは別の問題です。
通常、これらの各関数は、すべてがロードされた後に呼び出されますが、必ずしもそうではありません。あなたの場合、イベントが発生するMyNameSpace
前に参照があります。ready
Javascript がLALRタイプの言語であり、宣言されたシンボルが後で見つかる場合でも、これは良い習慣ではありません。MyNameSpace
jQuery がready
コールバック関数をトリガーする前に、後で別の値に設定するとどうなるでしょうか? ready
コールバックはその新しい参照を取得しません。意図的でない限り、すべての準備が整ったら、コールバック内で参照を行う必要があります。ready
次に、ready
コールバック内で、コンテキストを関数に割り当てる他の手法があります。lonesomedayは、あなたがやろうとしていることを達成するための正しい方法をほとんど与えてくれました。
(function() {
// this == MyNamespace
}).call(MyNamespace);
上記のコードは、無名関数をすぐに実行します。this == MyNameSpace
注: applyとcallの違いについては、こちらで説明しています
さて、あなたが提供したコードの下部が来ます:
//load the additional files that are needed and fire onReadyCallback
MyNameSpace.Util.loadFiles(defaultJsFiles,function(){
MyNameSpace.Util.require(['My.App','My.Theme','My.DomHandler'], function(){
onReadyCallback.apply(window);
});
});
これは問題があり、不要です。関数onReadyCallback
はそこでのみ必要ですか、それとも数回呼び出されますか? 一度だけ呼び出す必要がある場合は、グローバル名前空間を省いて、次のようにします。
//load the additional files that are needed and fire onReadyCallback
MyNameSpace.Util.loadFiles(defaultJsFiles,function(){
MyNameSpace.Util.require(['My.App','My.Theme','My.DomHandler'], function(){
// if everything is done loading, the function will be executed, otherwise
// it's execution will be postponed later
jQuery(function() {
// create our nicely wrapped anonymous function now
(function() {
if(!this.loggedIn()){
return;
}
// ...Lots of Code referring to MyNameSpace using "this"
})(MyNameSpace); // grab our most recent reference of `MyNameSpace`
});
});
});
インデントが気に入らない場合 (開発者の好みにすぎません)、ready
コールバック内のすべてを (something like)に置き換えます。
initMyNameSpace.apply(MyNameSpace);
グローバル空間の外側に関数を作成します。
function initMyNameSpace() {
if(!this.loggedIn()){
return;
}
// ...Lots of Code referring to MyNameSpace using "this"
};
しかし、少なくともrequire
コールバック関数に入れることをお勧めします...
- ...一度だけ実行される関数でグローバル名前空間を汚染しません
- ...どこからでもアクセスできません (非公開にしてください)
- ...ソースコードを編集するときにすぐに見つけることができます
- 等
注: 通常、applyとcallは、 または のようなオブジェクトに繰り返しアクセスすることを避けるために使用されますsome.thing.pretty.deep = value;
。1 つの関数を多くのオブジェクトに適用する必要があるが、すべてのオブジェクトに適用する必要がないため、オブジェクトのプロトタイプを拡張することはお勧めできません。
とにかくこれは私の意見であり、あなたのコードやあなたが何をしているのかについての知識がなくても、私はどのように物事を行うでしょうか。