我正在阅读关于module Javascript pattern的这篇文章,但我不明白“全球导入”的好处是什么。
有什么区别:
(function () {
alert($('#theForm').attr('method'));
} ());
和
(function ($) {
alert($('#theForm').attr('method'));
} (jQuery));
这两种方法都有相同的效果,所以我想我在这里忽略了这一点。
将全局变量作为匿名闭包中的参数传递是什么意思?有什么好处?
答案 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或任何其他库,这被称为全局导入。