2011-09-12 45 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或任何其他库,这被称为全局导入。