匿名关闭和全球进口

时间:2011-09-12 11:22:29

标签: javascript closures

我正在阅读关于module Javascript pattern的这篇文章,但我不明白“全球导入”的好处是什么。

有什么区别:

(function () {

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

} ());

(function ($) {

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

} (jQuery));

这两种方法都有相同的效果,所以我想我在这里忽略了这一点。

将全局变量作为匿名闭包中的参数传递是什么意思?有什么好处?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

在第二个版本中,您确保可以将$ dollar $用于jquery。否则,当您导入第二个javascript库时也会遇到麻烦,该库也使用美元符号作为别名(例如原型)。

所以在第二个版本中,你总是通过传入唯一名称(在这种情况下为jQuery)来确保不存在冲突。

答案 2 :(得分: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或任何其他库,这被称为全局导入。