2011-09-12 39 views
2

我正在閱讀關於module Javascript pattern的這篇文章,但我不明白「全球導入」的好處。匿名關閉和全球進口

之間有什麼區別:

(function() { 

    alert($('#theForm').attr('method')); 

}()); 

(function ($) { 

    alert($('#theForm').attr('method')); 

} (jQuery)); 

這兩種方法具有相同的效果,所以我覺得我在這裏錯過了點。

將全局變量作爲參數傳遞給匿名閉包的意義是什麼?有什麼好處?

回答

7

許多腳本(如Prototype和Mootools)也使用$字符。因此,不要在全球範圍內使用該字符有時很有用。您可以使用jQuery.noConflict()在jQuery中執行此操作。然後您必須使用jQuery來執行jQuery選擇等。

但是,如果你有,你知道只能使用jQuery的代碼(「模塊」,也許是)一個部分,你可以只使用該模式的該部分代碼重新定義$。稱爲jQuery函數外的對象現在被稱爲$在函數內部:

(function($) { // the first parameter is known as $ 
    // inside the function, you can access jQuery by the name $ 
}(jQuery)); // pass jQuery as the first argument 
+0

謝謝,現在它更有意義。 – vtortola

2

在第二個版本中,您確保您可以使用美元符號$作爲jquery。否則,當您導入第二個也使用美元符號作爲別名的javascript庫(例如原型)時,您可能會陷入困境。

因此,在第二個版本中,通過傳入唯一名稱(本例中爲jQuery),您始終確保不會發生衝突。

+0

非常感謝:) – vtortola

0

簡化示例來解釋,這將是如下。

var jqueryCloneLibrary = {libName : 'jqClone_1.1.1',size : '4kb'}; // 
(function(_){console.log(_.libName,_.size)}(jqueryCloneLibrary)) 

以上,在全球範圍內的克隆已申報並在var jqueryCloneLibrary參考存儲。

到對象的參考即jqueryCloneLibrary作爲參數傳遞給IIFE (immediately invoked function)

函數定義的內部通過,我們有定義爲_參數使用,我們能夠訪問屬性_.name_.size

我們以類似的方式包含jquery或任何其他庫,這被稱爲全局導入。