2012-11-03 87 views
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(..)函數調用的,當我嘗試訪問來自不同命名空間的常量,它是未定義的;兩者都很好。

正如你所看到的,我正在使用兩個init()函數,它只是調用init的調用,因爲我已經將函數包裝在一個附加對象中。

如果我刪除與CONSTANTS,VARIABLES等級相同的函數並嘗試在Test.FUNCTIONS中調用init(),它仍然不起作用。

編輯:

如果我我console.log(all_constants)得到充分的對象(.chunk_of_markup),但如果我console.log(tester)是得到undefined。如果我打包測試儀我得到[]

我還應該注意到,其他命名空間從單獨的文件獲取標記。

任何想法爲什麼?

+0

你得到了什麼錯誤? – Nelson

+0

請參閱編輯調試 – Alex

+0

爲什麼在對象方法中使用ready函數?它已經在init()實例化之前等待ready事件。 –

回答

1

準備好兩份文件在這裏沒有什麼區別。你可以直接使用一個document.ready和/或調用Test.FUNCTIONS.init,並且所有的都可以工作,而且它們在不同的命名空間中並不重要。

至於爲什麼你得到不確定的,我想這可能是因爲你的chunk_of_markup變量實際上不確定是在這一點上。我的猜測是你通過AJAX獲得它的價值,所以調用是異步完成的,這意味着DOM在它實際返回一個值之前就已經準備好了。當你使用調試器時,在你運行命令的時間點計算值,那麼異步調用已經成功返回(這是一個競爭條件,如果你足夠快,你的AJAX速度慢,那麼你可以仍然未定義,並且這也是爲什麼2個就緒函數會使AJAX調用返回,但它仍然不可靠)。

在所有情況下,如果我的理論是正確的,那麼你需要鉤住AJAX請求的回調,而不是DOM就緒事件,這是唯一可以保證變量已被定義的地方。

0

爲什麼不叫在文檔處理程序本身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(); 
}); 
做任何事
+0

道歉,問題措辭相當糟糕,但我已經解釋說,這沒有任何工作 – Alex

相關問題