2010-04-23 76 views
1

在我看來,這應該工作,但我不能看到到底是什麼問題。的Javascript關聯數組

錯誤林接收是「沒有定義DDROA」

誰能幫賜教。

var DDROA = { 
    AllowedRoutes : { 
     AR0 : {text : 'SomeText', value : 'SomeValue'}, 
     AR1 : {text : 'SomeText2', value : 'SomeValue2'} 
    }, 
    RouteContext : { 
     RC0 : {text : 'None', value : '0', 
      AllowedRoutes : new Array(
       DDROA.AllowedRoutes.AR0 // An error occurs here 
      ) 
     } 
    } 
} 

編輯

鬆弛的評論 你能幫助解釋爲什麼我必須完成聲明DDROA.AllowedRoutes然後再拍語句添加DDROA.RouteContext在一個單獨的stament。從本質上講,你告訴我,我必須

var DDROA = {AllowedRoutes : {}}; 

然後

DDROA.RouteContext = {}; 

爲什麼兩個單獨的語句。我做的事情就像

var Utilities = { 
    TextBased : { 
    someFunction : function(){ 
     //do stuff 
    }, 
    someFunction2 : function() { 
     Utilities.TextBased.someFunction(); 
    } 
    } 
}; 

有什麼區別?在我看來,我應該得到同樣的錯誤?

+1

你濫用'Array'構造。 – SLaks 2010-04-23 00:44:52

+0

請參閱我編輯的答案。 – SLaks 2010-04-23 01:14:54

回答

2

您的DDROA變量僅在之後被賦值該對象被創建。
因此,當對象被初始化時,DDROAundefined

要解決它,你應該設置RouteContext分開,就像這樣:

var DDROA = { 
    AllowedRoutes : { 
     AR0 : {text : 'SomeText', value : 'SomeValue'}, 
     AR1 : {text : 'SomeText2', value : 'SomeValue2'} 
    } 
}; 
DDROA.RouteContext = { 
    RC0 : {text : 'None', value : '0', 
     AllowedRoutes : [ DDROA.AllowedRoutes.AR0 ] //An error does not occur here 
    }   
}; 

此外,由於一個參數的情況下, Array構造函數將數組的長度

爲了使陣列與單個元件,使用數組字面,這樣 [ DDROA.AllowedRoutes.AR0 ]


要回答你的問題,編輯,當函數被調用時,纔會執行函數內部的代碼,這是變量分配後。

+0

試過這個,仍然得到相同的錯誤..同樣的線。也許有些探討爲什麼你認爲使用一個字面數組定義將工作,而不是新的Array()。 – 2010-04-23 00:50:27

+0

如果傳遞一個非整數參數,數組構造函數將正確地創建一個具有單個元素的數組。這就是說,可能是更好的做法,以避免它; O) – 2010-04-23 00:51:21

+0

邁克,我相信我已經證明,當通過一個非整數參數的構造函數ARRY不會與一個單一的元素創建一個數組。或者你想念你的評論,或者我不理解你的評論。 – 2010-04-23 00:54:09

0

你的第二個例子作品的原因是因爲你定義一個函數,所以不執行其中的代碼,直到你調用該函數,此時你的對象完全實例和參考子對象已驗證。在您的第一個示例中,當您嘗試訪問它時,該對象不存在。