2

这是 jQuery 代码吗

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

相当于

$(document).ready(function () {
});

如果是,两者有什么区别?如果不是,第一个做什么?

编辑:

谢谢大家。大多数反应与不同的口味和样品相似

4

5 回答 5

5

它们不是等价的。

您的第一个示例是立即调用函数表达式 (IIFE)。它围绕本地定义的变量创建一个闭包。

您的第二个示例指定了在DOM 完全加载时执行的函数。它用于确保 DOM 中的所有元素节点在执行包含的代码之前都是可用的。这也是一个闭包。

这两个示例都使用匿名函数。

值得指出的是,使用这两个示例是一种很好的做法,如下所示:

(function($){
    // locally-scoped, DOM-is-NOT-Ready-code here.
    $(function () {
        // your locally-scoped, DOM-is-ready-code here.
    });
}(jQuery)); // note that I've moved the invocation into the parens
            // that contain the function.  This makes JSLint happy!
于 2010-12-16T23:43:16.807 回答
3

绝对不是,第一个是自执行匿名函数,第二个是ready处理程序。

(function(jQuery){
  //jQuery in this scope is referencing whatever is passed-in
})(jQuery);

因此,jQuery函数内部不一定与jQuery函数外部相同。但是您通常不希望将全局变量名与本地变量名混合使用。

举个例子:

(function(obj) {
   alert(obj);
})('Hello');

这定义了一个函数,然后立即调用它,传入“Hello”

于 2010-12-16T23:43:00.507 回答
3
$(document).ready(function () {

});

相当于:

$(function() {

});

第一个片段是一个立即调用的匿名函数,它创建了一个本地范围:

(function() {
    var x = 2;
})();

alert(x); // undefined
于 2010-12-16T23:43:47.803 回答
2

不,第一个并没有真正做太多。只需将内部的任何变量与周围的范围分开,并jQuery在内部创建一个局部变量。

第二个传递一个在 DOM 准备好之后运行的函数(换句话说,在 DOM<body>加载之后)。

一个常见的等价于:

$(document).ready(function () {
});

是:

$(function () {
});

它做同样的事情。

虽然这样:

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

常写为:

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

使$变量不再是全局变量。如果全局$变量已在使用中,则很有用。

于 2010-12-16T23:43:36.697 回答
1

一点也不。第一个是闭包 - 您创建然后立即调用的函数。但是,通常您会像这样将两者结合起来:


  (function($) {
    // use the $ variable
    $(document).ready(function(){
      // ...
    });
  })(jQuery);

通过创建闭包,您可以将“jQuery”重命名为“$”,只是在本地为该代码块。使用闭包语法的原因是您可以使用 $ 变量,即使它可能没有被定义为全局范围内的 jQuery 对象(即一些 JavaScript 框架,如原型使用 $ 作为变量)。

每当您编写 jQuery 插件时,您都应该将所有 jQuery 代码包含在这种闭包中,这样它就不会干扰任何其他 JavaScript 框架。如果您不编写插件并且不使用任何其他 JavaScript 框架,您可能不必费心将代码封装在闭包中。

于 2010-12-16T23:57:57.523 回答