29

我需要帮助理解这种 jQuery 插件创作模式。有人可以为我解释一下这个简单的代码吗?

(function($) { /* Code here */ })(jQuery);

我知道这是为了避免与使用相同$字符的不同插件发生冲突,但不知何故我无法理解它是如何工作的。$参数与被解析的jQuery对象有什么关系?

4

5 回答 5

62

让我们分解一下:

(function($) { /* Code here */ })(jQuery);

首先,构造:

(function() {})();

创建一个立即执行的函数表达式(通常称为 IIFE)。这是一个立即执行而不是现在定义但稍后调用的函数。它本质上是一个匿名(未命名)函数,被定义然后立即执行。

然后,像这样将 jQuery 传递给它:

(function() {})(jQuery);

将 jQuery 作为第一个参数传递给立即执行的函数。然后,将第一个参数命名为$定义函数内的符号以对应于传递的第一个参数。

(function($) {})(jQuery);

展开形式如下:

(function($) {
    // you can use $ here to refer to jQuery
})(jQuery);

对于 jQuery 插件作者来说,这有一些好处:

  1. IIFE 创建一个局部函数上下文,因此您可以拥有对您的插件来说是“全局”的变量,但实际上不是全局变量,因此不会污染或与实际的全局变量命名空间发生冲突。

  2. 您可以使用$for jQuery 进行编程,无论宿主程序实际上是否具有为 jQuery 定义的内容,因为您已$在函数中本地定义。

于 2013-10-26T18:54:30.907 回答
11

你所拥有的是这样的简写:

function anonymous_function($) {
    // Code here
};
anonymous_function(jQuery);

如您所见,它允许将$符号用作对jQuery函数内部对象的引用。

于 2013-10-26T18:54:17.003 回答
2

JavaScript 中的函数可以是语句或表达式。当您使用函数表达式时,您可以像传递任何其他值一样传递它:

> console.log(function() { 1 + 1; });
> (function() {}) && doExpensiveWork();
// etc.

使用函数表达式可以做的一件事就是立即调用它。在这种情况下,该函数被称为立即调用的函数表达式(或简称 IIFE)

> (function() { console.log("IIFE running"); })();
IIFE running

这与创建函数并分两步调用它相同:

> var notAnIIFE = function() { console.log("running"); };
> notAnIIFE();
running

当然,函数表达式可以接受参数:

> var someFunction = function(x, y) { return x + y; };
> var seven = someFunction(3, 4);
> seven
7

因此,也可以使用参数调用IIFE :

> var seven = (function(x, y) { return x + y; })(3, 4);
> seven
7

在这样的调用的情况下:

(function($) { /* do work with $ */ })(jQuery);

绑定到名称的值jQuery作为参数传递给函数表达式$。这类似于执行以下操作:

var initializePlugin = function($) {
    /* do work with $ */
};
initializePlugin(jQuery);

但它在父命名空间中没有留下任何痕迹(而在我们的第二个示例中,initializePlugin我们完成插件设置后留下了我们的名字)。

于 2013-10-26T18:57:57.270 回答
1

javascript中的函数创建了一个范围,它不仅仅是关于$变量,而是关于函数本地的变量。并且给定$参数,它成为函数的本地并且可以安全使用,参考jQuery.

于 2013-10-26T18:52:24.930 回答
1

+1 为 jfriend00 的回答。

但是在页面中包含 jQuery 会覆盖全局符号 jQuery 和 $(参见jQuery.js 第 9579 行),这可能会导致与定义全局 $ 的其他库发生冲突。

因此,更进一步,也可以阻止全球 $ 冲突:

(function($) {
    // you can use $ here to refer to jQuery
})(jQuery.noConflict());

如下所示:

<script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
<script>
(function($) {
   console.log('want $ to be jQuery here so want true: ' + ($ === jQuery));
})(jQuery.noConflict());
console.log('do not want $ to be jQuery here so want false: ' + ($ === jQuery));
</script>
于 2015-04-18T10:43:33.280 回答