2

次の構造のスクリプトがあります。

Test = {

    CONSTANTS : {},
    VARIABLES : {},
    MARKUP : {},
    FUNCTIONS : {
        init : function () {

            // Access variable from different namespace
            var all_constants = DifferentNamespace.CONSTANTS; // WORKS
            var tester = DifferentNamespace.CONSTANTS.chunk_of_markup; // SAYS UNDEFINED
        }
    },
    init : function () {

        // Call real init() function

        $(document).ready(function () {

            Test.FUNCTIONS.init();
        });
    }

};

$(document).ready(function () {

    Test.init();
});

関数呼び出しのいずれかを削除すると$(document).ready(..)、別の名前空間から定数にアクセスしようとすると、未定義になります。両方ともうまく機能します。

ご覧のとおり、2 つのinit()関数を使用しています。1 つは、関数を追加のオブジェクト内にラップしているため、init の呼び出しを整理するためだけのものです。

CONSTANTS、VARIABLES などと同じレベルにある関数を削除し、init()Test.FUNCTIONS 内で呼び出そうとしても、まだ機能しません。

編集:

console.log(all_constants)が完全なオブジェクトを(.chunk_of_markupで)取得した場合、しかし私console.log(tester)が getの場合undefined. テスターをラップすると、[]

また、別の名前空間が別のファイルからマークアップを取得することにも注意してください。

理由はありますか?

4

2 に答える 2

1

2 つのドキュメントを用意しても、ここでは違いはありません。1 つの document.ready を用意するか、Test.FUNCTIONS.init を直接呼び出すと、すべてが機能するはずです。それらが異なる名前空間にあるという事実も問題ではありません。

未定義になっている理由については、おそらく、chunk_of_markup変​​数が実際にはその時点で未定義であるためだと思います。私の推測では、AJAX を介して値を取得しているため、呼び出しは非同期で行われるため、実際に値を返す前に DOM の準備が整います。デバッガーを使用すると、コマンドを実行した時点で値が評価されるため、それまでに非同期呼び出しは既に正常に返されます (競合状態です。十分に高速で AJAX が遅い場合は、まだ定義されていません。また、2 つの準備ができている関数によって、AJAX 呼び出しが返されるのに十分なほど遅くなる理由でもありますが、それでも信頼性は低くなります)。

すべての場合において、私の理論が正しければ、DOM Ready イベントではなく AJAX リクエストのコールバックにフックする必要があります。これは、変数が定義されていることを保証できる唯一の場所です。

于 2012-11-03T20:04:36.460 に答える
0

ドキュメント Handler 自体で を呼び出さないのはなぜですかfunction init()..同じ問題につながるとは思いません..Test.init()ここでは何もしないように見えるので、 を完全に削除できます

Test = {
    CONSTANTS : {},
    VARIABLES : {},
    MARKUP : {},
    FUNCTIONS : {
        init : function () {

            // Access variable from different namespace
            var all_constants = DifferentNamespace.CONSTANTS; // WORKS
            var tester = DifferentNamespace.CONSTANTS.chunk_of_markup; // SAYS UNDEFINED
        }
    }
};

$(document).ready(function () {

    Test.FUNCTIONS.init();
});
于 2012-11-03T19:43:49.777 に答える