2010-11-16 47 views
2

我看設立這樣的jQuery插件和其他JavaScript庫文件:幫助理解JavaScript的約定

(function($,window,undefined){ 
    ...plug-in code... 
}); 

爲什麼要來包裝腳本的功能,也可以在功能獲得什麼ARGS ?

回答

1

除了全局函數,Javascript中唯一的作用域是函數作用域。在函數中包裝代碼塊是確保變量不會泄露到代碼其餘部分的唯一方法

函數可以接收參數的唯一方法是,只要定義它時立即調用它(事實上,這是這個函數永遠不會有它的代碼執行的唯一途徑):

(function($,window,undefined){ 
    ...plug-in code... 
})(jQuery,this,...); 
1

的原因是在doc:

,以確保你的插件不 碰撞與其他 可能會使用美元的圖書館簽名,這是一個最好的 實踐將jQuery傳遞給自己的執行函數(閉包) 將其映射到美元符號,因此它不能被 覆蓋其執行範圍內的另一個庫。

這裏閱讀:http://docs.jquery.com/Plugins/Authoring

6

接收到的ARG遊戲:

(function($,window,undefined){ 
    //.. 
})(jQuery, window); 

$:一個jQuery對象引用,往往能夠稱其爲$別名發,因爲在外部範圍內,代碼可能處於「兼容模式」。

window:該window參數常被用來縮短標識符查找。在瀏覽器腳本中window是全局對象的一個​​屬性,爲了解決它,標識符解析進程必須檢查每個範圍,直到達到全局範圍。如果我們添加window作爲參數,則無論函數如何嵌套,查找都會很短。

在非瀏覽器腳本環境中,window標識根本不存在,這模式是保持全球目標的軌道常見的方式,如:

(function (global, undefined) { 
    //.. 
})(this); 

注意,對於this全局代碼(不是函數代碼),總是指全局對象。

undefined:最後但並非最不重要的undefined的說法,它是作爲一個「安全措施」,因爲undefined也是全球對象的屬性,並在ECMAScript的第三版規範,它的值是可變的,想象,:

undefined = true; 

這會打亂了你的代碼,但如果我們有一個說法,我們不傳遞任何東西給它,它會保持未定義的值

幸運的是,ECMAScript第5版規範中已修復undefined,InfinityNaN不再可寫。 :)

+0

哇,我不知道那裏的未定義位。奇怪的是,undefined是可變的。 – Matt 2010-11-16 15:48:48

+0

'typeof myVar ==「undefined」'幾乎是最安全的使用比較,但是這個安全措施很好。 – Gareth 2010-11-16 15:52:36

+0

@Matt,是的,在ECMAScript 3上是不好的,'undefined'不是* null *,'true'或'false',是全局對象的可寫屬性:( – CMS 2010-11-16 16:45:35