2012-06-23 71 views
0

我讀了關於jQuery插件,並在官方指南的作者說:jQuery插件和全局變量

「別急哪裏是我真棒美元符號,我知道,愛但是它仍然存在,?爲了確保您的插件不會與其他可能使用美元符號的庫衝突,最好將jQuery傳遞給將它映射到美元符號的IIFE(立即調用函數表達式),以便它不能被覆蓋由另一個圖書館在其執行範圍內「。

下面是示例代碼:

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

     // Do your awesome plugin stuff here 

    }; 
})(jQuery); 

我的問題是,爲什麼是必要的IIFE,什麼是可以沒有它發生碰撞的一些例子嗎?執行時,$參數將被Jquery全局變量替換,因此IIFE正在修改一個全局變量。對我而言,這似乎表明碰撞與以前一樣可能。我知道我在這裏錯過了一些東西。非常感謝您的幫助!

回答

1

$符號被其他庫(如prototypeMooTools)用作全局變量。因此$全局變量可能不會引用jQuery;這是jQuery's noConflict method存在的原因。

因此,如果您的插件要用於除jQuery之外的原型或MooTools的頁面,則無法確定$將引用jQuery,但您可以假設jQuery變量將會。如果你正在編寫一個插件,你希望儘可能簡單地讓其他人使用。因此,您希望無縫地與其他庫一起使用。

該IIFE使它有可能具有這種安全性,並仍然有在代碼中使用$的便利。如果你總是使用jQuery引用而不是$來引用jQuery庫,那麼IIFE是不必要的。

+0

非常感謝您的幫助。這很有道理! – voltair

+0

你還需要什麼嗎?如果你發現我的答案有幫助,你會介意選擇它,謝謝。 –

0

試想一下,其他一些圖書館「偷」的$全局變量(通過指定自己的庫對象的話):

$ = otherLibrary; 

現在,$指其他圖書館,但jQuery(這也是一個全局變量)仍然指向jQuery庫。

如果你的插件是這樣寫的:

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

它不會因爲$被分配到jQuery的$.fn對象並不是指jQuery庫了。

但是,如果你的插件是這樣寫的:

(function ($) { 
    $.fn.myPlugin = function() { ... }; 
}(jQuery)); 

自(本地)參數$將被分配給jQuery的$.fn目的是全局變量jQuery參考。

所以:

$ === jQuery // false 

(function ($) { 

    $ === jQuery // true 

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

}(jQuery)); 

$ === jQuery // false 

的參數$遮蔽全局變量$(它指的是其他庫)。