2016-02-11 64 views
0

我想了解以下兩組代碼之間的區別。當我使用jquery插件定義時,我可以訪問自封閉函數之外的插件。但是,如果我試圖簡單地設置一些具有相同自封閉功能的對象,它不起作用。爲什麼我的對象在文檔準備就緒時不可用?

這工作:

(function($) { 
    $.fn.test = function(message) { 

     return this.each(function() { 
      $(this).text(message); 
     }); 

    } 

}(jQuery)); 

$(document).ready(function() { 
    $('p').test('This works!'); 
}); 

不起作用:

(function($) { 


var neato={ 
    start:function(){ 
     $('p').html('We must have an issue of scope or similar, this does not work'); 
    } 
} 


}(jQuery)); 

$(document).ready(neato.start); 

有沒有一種方法,使在這種情況下,自我封閉的功能我對象中使用之外?

+1

'$ .fn = jQuery.prototype'。換句話說,通過給'$ .fn'添加一個屬性,你可以將該屬性添加到jQuery對象原型中。 jQuery對象從jQuery調用返回(如'$(document)')。 – Stryner

回答

5

將代碼放入IIFE的全部目的是爲了確保外部代碼無法訪問其內部的變量。如果要訪問它,則必須將其附加到在該函數範圍之外聲明的變量,因此在您的示例中爲全局的$對象。或者,您可以將其附加到窗口:

(function ($) { ... 
    .... 
    window.neato = neato; 
})(jQuery); 

$(document).ready(neato.start); 
+0

好的,我當然想保持這個範圍的保護,而不是讓其他東西進入。沒問題,那麼只需在IIFE中調用我的文檔? – absentx

+1

完全沒問題 – sahbeewah