0

私のアプリケーションは次のような構造になっています

window.object1;
window.object2;
$(document).ready(function() {
   window.object1 = new type1object();
});

function type1object() {
   //lots of code
   this.property = 'property';
   window.object2 = new type2object();
}

function type2object() {
   //lots of code
   this.property = new type3object();
}

function type3object() {
   //lots of code
   console.log(window.object1);
   this.property = window.object1.property;
}

問題は、ドキュメントレディコールバック以外の場所からwindow.object1にアクセスしようとすると、未定義として返されることです。これは、DOM window.object1を調べたときに、期待どおりに定義されている場合でも同じです。

上記と同じことを試しましたが、代わりに単純なグローバル変数を使用しました(つまり、window.object1の代わりにvar object1)...さまざまな場所でobject1とobject2の初期ダミー値を宣言しようとしました...しかし同じ問題に直面します。

グローバル変数にグローバルにアクセスできない理由を誰かが知っていますか?

4

3 に答える 3

2

window.object1を開始した後、それを評価していることを確認する必要があります。つまり、あなたの場合、document.readyの実行が終了した後でのみです

以下のこの例を見ると、クリックすると両方が初期化されていることがわかります。

<html>
    <body>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
    <script>        
        $(document).ready(function() {
           window.object1 = new type1object();
           window.object2 = new type2object();
           //console.log(window.object1);
        });

        $(document).click(function(){
            console.log(window.object1);
            console.log(window.object2);            
        });

        function type1object() {
        }

        function type2object() {
        }

    </script>
于 2009-10-21T09:52:08.950 に答える
1

ドキュメント準備機能の内部に入るまでの値を設定していないため、実行されるまで値window.object1にアクセスできません。

コードには、そのドキュメントレディコールを完全に削除できなかったことを示すものはありません。これは通常、要素がdomにロードされるのを待つために予約されていますが、これはあなたが行っているようには見えません。どういうわけ、そこにないコード内で待機する必要のある要素がある場合は、ページの下部、タグのすぐ上にスクリプトを配置するだけです。これにより、ドキュメントの準備ができた場合と同等の処理が行われます。

于 2009-10-21T09:42:08.463 に答える
1

本当に削除されたコードを書くと、答えが落ちてしまいました-object1の構築中にobject1を参照するものを作成していました。

そこで、これに変更して、オブジェクトが(コンテンツは含まれていなくても)参照しようとする前に存在するようにしました。

window.object1;
window.object2;
$(document).ready(function() {
   window.object1 = new type1object();
   window.object1.construct();
});

function type1object() {
   //lots of code
   this.construct = function() {
      this.property = 'property';
      window.object2 = new type2object();
   };
}

function type2object() {
   //lots of code
   this.property = new type3object();
}

function type3object() {
   //lots of code
   console.log(window.object1);
   this.property = window.object1.property;
}
于 2009-10-21T17:16:11.500 に答える