2009-10-21 252 views
0

我的應用程序有類似如下結構問題訪問全局JavaScript變量

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是完全按照我的預期定義的。

我已經嘗試做與上面相同,但使用簡單的全局變量(即var object1,而不是window.object1)...試圖聲明初始虛擬值object1和object2在各地...但跑起來反對同樣的問題。

有誰知道爲什麼我不能全局訪問我的全局變量?

+0

你執行'type2object()'前'$(文件)。 ready'執行並初始化'window.object1'? – 2009-10-21 09:40:22

+0

沒有。以上是我的代碼的一個非常簡化的版本,但一切都按照 – wheresrhys 2009-10-21 09:46:40

+0

@wheresrhys的順序發生 - 它在Firebug中適用於我。你能夠將函數'type1object'和'type2object'內的代碼給出嗎? – 2009-10-21 09:49:20

回答

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; 
} 
+0

可能會更好地將引用傳遞給父類/相關對象的構造函數...注意:這可能會導致頁面內存泄漏,因爲對象被創建/銷燬,這不是一個大問題,因爲它僅限於一個頁面,但是在打開一整天或更長時間的大型應用程序中,這可能會成爲問題。特別是在較舊的瀏覽器中。 – Tracker1 2009-10-21 22:29:01

1

由於在文檔準備就緒功能之前,您沒有設置window.object1的值,所以在運行之前您無法訪問它。

您的代碼中沒有任何內容顯示您無法完全刪除該文檔準備就緒的調用。它通常用於等待元素加載到dom中,這看起來並不像你正在做的那樣。如果你以某種方式有一些元素需要在不存在的代碼中等待,只需將腳本放在頁面底部,即標籤正上方。這將做相當於文件的準備。

+0

,但即使我把一個console.log(window.object1)文檔準備好後,它顯示undefined – wheresrhys 2009-10-21 09:44:19

+0

這正是我的觀點。文檔就緒調用中的代碼不會立即執行。所以你在之後可能會運行的代碼。 – 2009-10-21 09:56:44

+0

ok ...但即使如此,type2object中的console.log也會在文檔準備好之後發生,因爲window.object2是在文檔中創建的。 – wheresrhys 2009-10-21 16:57:21

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> 
+0

有趣。所以現在的問題是,爲什麼type2object會在type1object完成構造之前運行?我一直認爲JavaScript是時間語言的一項任務(只要不使用ajax)。 – wheresrhys 2009-10-21 17:00:53