2011-11-10 36 views
0

我正在閱讀有關寫作jQuery plugins有一節討論保存美元符號符號,以便它不會與其他使用它的庫衝突。jQuery創作和關閉

它說:

這將jQuery傳遞給一個自我執行的函數 (關閉),它映射到美元符號,因此它不能被覆蓋 由另一個庫的範圍最佳實踐其執行

這裏是他們是如何做到這一點:

(function($) { 
    $.fn.myPlugin = function() { 

    // Do your awesome plugin stuff here 

    }; 
})(jQuery); 

我試圖underst他們在說什麼以及這段代碼在說什麼。以下代碼如何得到評估?

function($){}是否被執行並獲得jQuery對象傳遞給它?

jQuery對象是否成爲$?

+0

是的,只是一個參數。 –

回答

2

是; function($) { ... }被傳遞給它的jQuery對象執行。 $參數隱藏了父範圍的$變量(如果有的話),併爲其賦予jQuery變量的值,但僅限於該代碼塊。

你想做到這一點$可以由不同的庫(比如,Prototype)使用的原因,但你還是希望能夠使用$簡寫jQuery你的插件內。通過創建一個採用參數$並使用jQuery作爲參數的函數,可以在該函數中使用$而不是jQuery,而不會覆蓋Prototype所使用函數以外的$

2

可以寫爲:

function add_my_plugin_to_fn($) { 
    $.fn.myPlugin = function() { 
    } 
} 

add_my_plugin_to_fn(jQuery); 

//window.jQuery = stuff; // in jquery initializer 
function add_my_plugin_to_fn(any_object_with_fn_property) { 
     any_object_with_fn_property.fn.myPlugin = function() { 
     } 
    } 

    add_my_plugin_to_fn(jQuery); 

都將一個函數添加到jQuery的fn.myPlugin財產。我們使用$的唯一原因是因爲jQuery人員喜歡使用單字母'$'作爲函數名稱。它可能很容易是jQuery.fn.mypluginjq.fn.myplugin_.fn.myplugin

這可以讓你擺脫情況下發生此類事情

my_awesome_javascipt_.js 
    function $(add_to_this) { 
     return add_to_this + 1; 
    } 


jQuery.js 

    window.jQuery = //all the jquery stuff 
    //sees that window.$ already has a function in it and leaves it alone 


my_jquery_plugin.js 
    $.fn.myplugin; //this doesn't exist because $ is a function from the first file 
    //you should have used jQuery.fn.myplugin. But that is a lot to type out. Doing the 

立即-調用函數招強制變量「$」有文件的範圍。

是的,語言真的應該爲你做。這是一種愚蠢的機制,可以默認爲全球性的。如果你想要修復它的東西,看看coffeescript它可以幫助你寫入沒有很多基本錯誤的JavaScript