2013-10-16 117 views
0

我正在開發使用模塊模式,並想知道爲什麼我無法使用此模塊訪問模塊範圍。也許我對於揭示模塊模式的理解是錯誤的。使用此模塊的Javascript模塊模式範圍

這裏是我使用的代碼:

var BLOG = window.BLOG || {}; 

BLOG.Module = (function(){ 

    var 
     _this = this, 
     _hasLoaded = false; 


    function init(){ 
     console.log(_this); // Logs the Window object 

    } 


    function _privateMethod(){ 
     $.ajax({ 
      url: 'lazyload/lazyload.html', 
      success : function(data){ 
       // _hasLoaded = true; // I want to access the variable in my module, How do I refer to it? 
      } 

     }); 
    } 


    return { 
     init : init 
    }; 

})(); 
+0

它是什麼,你想指與'this'?你能給個例子嗎? –

+0

我已經添加了我想要做的,在ajax成功中,我想訪問_hasLoaded變量並將其設置爲true。 – arlg

+0

@ arlg:您只需使用_hasLoaded = true;'_privateMethod',並且您的ajax成功處理程序都是通過該變量的閉包。我已經更新了我的答案,詳細內容以及可能是有用的鏈接。 –

回答

3

this由函數是如何被調用來確定。如果它是直接調用的,而不是通過對象屬性(因爲您的外部範圍函數是),那麼調用this將是鬆散模式下的全局對象(在嚴格模式下爲undefined)。在瀏覽器上,這是窗口對象。

您通常不會使用this來嘗試引用該最外層範圍函數中的內容(出於此原因)。

如果事情這樣做:

BLOG.Module.init(); 

...然後調用initthis(不_this)內將參考Module,你可以參考你在最後創建對象的其他屬性你最外面的範圍函數(目前沒有其他任何人,只是init)。


回覆您的編輯:

var 
    _this = this, 
    _hasLoaded = false; 

// ... 

function _privateMethod(){ 
    $.ajax({ 
     url: 'lazyload/lazyload.html', 
     success : function(data){ 
      // _hasLoaded = true; // I want to access the variable in my module, How do I refer to it? 
     } 

    }); 
} 

只是取消註釋行:

_hasLoaded = true; 

這是因爲這兩個_privateMethod和調用_privateMethod的產生的任何阿賈克斯成功處理程序關閉在最外面的範圍函數中定義的變量。所以你直接引用它們。

如果對這個詞的使用「閉包」不熟悉,請不要着急,closures are not complicated


邊注:這是一個奇怪的構造:

var BLOG = window.BLOG || {}; 

...因爲它混合代碼要求它是在與代碼全局範圍並不要求它在全局範圍內。它功能完全,只是有點奇怪。我可能會去的一種方式或其他:

// Requires that it's at global scope (and yes, this does work) 
var BLOG = BLOG || {}; 

// Creates a global whether it's at global scope or not 
window.BLOG = window.BLOG || {}; 
+0

感謝您的回答,當我在init中調用console.log(this)時,我獲得了init函數,但不是模塊 – arlg

+0

@arlg:這又取決於您如何調用它。如果你在'init'內調用'BLOG.Module.init()','this'將會是'BLOG。模塊「(您從範圍函數返回的對象)。 –

+0

@arlg:如果你回答我發佈問題時幾乎問過你的問題,那真的會有所幫助(請參閱問題下的評論)。 –