简单解释
它只是创建一个闭包,您可以在其中引用jQuery
with $
,即使它处于noConflict 模式。
在 jSang 的回答 (+1) 的插件创作中也有解释。
从技术上讲,它只是定义了一个匿名函数,该函数接受一个被调用的参数$
并立即将其jQuery
作为唯一参数传递,因此$
用作jQuery
此函数范围内的别名 - 请注意,$
在此闭包内无法访问全局范围内的 。
这意味着,如果您$
在全局范围内使用 Prototype,您将无法$
在闭包内访问 Prototype using,因为$
引用 jQuery 的本地范围优先。
当然,如果你需要在你的闭包中使用另一个库的方法,你可以使用 2 个参数来定义它:并假设另一个库正在使用命名空间来(function($j, $p) {
调用它。或者更简单地说,将闭包的局部作用域 var 别名为与其他库的全局作用域 var: 不同的别名,这意味着全局仍然可以在函数作用域内访问。请注意,后一种效果可能是不可取的,因为除非您在文档中明确写入,否则您无法完全确定用户分配的内容。我猜需要多个库的插件有点离题,所以让我们把它留在那里。(jQuery, $)
$
(function($j) {
$
$
稍微详细一点
noConflict 文档页面中的一个实际关闭示例:
jQuery.noConflict();
(function($) {
$(function() {
// more code using $ as alias to jQuery
});
})(jQuery);
该闭包在其范围内具有别名jQuery
,例如,如果您的用户拥有 Prototype 或其他使用全局命名空间的库$
,则非常有用。这使您的插件更加坚固且不易出错。$
无论 jQuery 是否控制 $ 变量,都可以使用闭包,因此它是插件创作的理想选择。
想象一下,如果您的一位最终用户在 noConflict 模式下使用 jQuery 并使用$
命名空间进行原型制作,并且您的插件尝试$
使用 jQuery 方法进行扩展?混沌与小马!
当然,您可以跳过闭包并将所有内容替换$
为jQuery
,但这会使您的代码更长,并且对许多开发人员来说可读性更低。
另外,JavaScript 闭包是如何工作的?如果您在理解闭包时遇到困难,会有很多有用的答案,即使这个问题不需要对闭包有太多深入的了解。:)