有人可以解释jQuery中的函数($)

时间:2012-10-12 14:34:53

标签: javascript jquery closures

最近我正在阅读其他人的代码,并且发现了这个:

// Semicolon (;) to ensure closing of earlier scripting
// Encapsulation
// $ is assigned to jQuery
;(function($) {

     // DOM Ready
    $(function() {
        ...
  });

})(jQuery);

我理解领先的观点;,我理解$(function(){与文档准备相同,但添加函数($)的重点是什么?

我理解它是一个闭包,但由于这个在全局范围内被调用,所以看起来你不需要为此烦恼。 $(function(){将使用相同的全局对象,不是吗?

是为了防范某些事情,还是出于其他原因的最佳做法?

2 个答案:

答案 0 :(得分:12)

这是jQuery插件的常见结构。它可以防止$标识符被覆盖并用于其他内容。在匿名函数中,$总是引用jQuery。

示例:

$ = "oh no";
$(function() { //Big problem!
    //DOM ready
});

通过引入新范围,您可以确保$引用您期望的内容:

$ = "oh no";
(function($) { //New scope, $ is redeclared and jQuery is assigned to it

    $(function() { //No problem!
        //DOM ready
    }); 

}(jQuery));

这背后的主要原因是许多其他JavaScript库使用$作为标识符(例如PrototypeJS)。如果你想同时使用Prototype和jQuery,你需要让Prototype拥有它的$标识符,但是你可能不希望每次想要调用jQuery方法时都写出jQuery。通过引入新的作用域,您可以让jQuery在其执行上下文中使用$

答案 1 :(得分:1)

您提供的代码示例是自调用函数的示例:

(function(){
 // some code…
})();

第一组括号定义了一个函数:(括在括号中的匿名函数)

(function() {})

它定义了匿名函数。就其本身而言,它什么都不做。但是,如果在定义后添加一组括号(),则它与用于调用函数的括号相同。 试试这个:

(function(message) {
  alert(message);
})("Hello World");

创建一个接受参数的函数,并显示一个包含所提供值的警告框。然后,它立即使用参数“Hello World”调用该函数。


在您的示例中,定义了自调用函数。它接受一个名为$的参数。然后,立即调用该函数,并引用jQuery作为参数传入。

如果您希望jQuery以noConflict()模式运行(这将删除对$的全局引用),这很常见。

noConflict()模式下,你仍然可以通过jQuery全局变量访问jQuery,但是大多数人宁愿使用$,所以这个自调用函数接受全局{{1}变量作为函数范围内的jQuery参数,让您可以在自调用函数中自由使用$快捷方式,同时让jQuery在noConflict()模式下运行以避免冲突与其他在全局范围内使用$的库。

希望这能回答你的问题!