8

最近我正在阅读别人的代码,并遇到了这个:

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

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

})(jQuery);

我理解前导的意思;,并且我理解 $(function() { 与 document ready 相同,但是添加 function($) 有什么意义?

我知道这是一个闭包,但是由于它总是在全局范围内被调用,所以您似乎不需要理会它。$(function() { 将使用相同的全局对象,不是吗?

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

4

2 回答 2

13

这是 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$回到那个执行上下文中。

于 2012-10-12T14:36:00.150 回答
1

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

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

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

(function() {})

这定义了匿名函数。就其本身而言,它什么也不做。但是如果()在定义后面加上一组括号,就和调用函数的括号是一样的了。试试这个:

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

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


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

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

noConflict()mode 下,你仍然可以通过jQuery全局变量访问 jQuery,但大多数人更愿意使用$,所以这个自调用函数接受全局jQuery变量作为$在函数范围内命名的参数,这让你可以自由使用$内部的快捷方式让 jQuery 在 noConflict() 模式下运行时的自调用函数,以避免与$在全局范围内使用的其他库发生冲突。

希望这能回答你的问题!

于 2012-10-12T14:47:28.120 回答