2

我已经将我的 javascript 封装在

jQuery(document).ready(function($) {

});

我想知道通过以下两种方式在其中调用函数的含义是什么:

jQuery(document).ready(function($) {
    $(function () {
        // do something
    });
});

对比

jQuery(document).ready(function($) {
    (function () {
        // do something
    })();
});

编辑:

我还想知道两者中哪一个是更“正确”的做事方式?随意添加您自己的实现。

4

5 回答 5

4

不同之处在于执行顺序:

jQuery(document).ready(function($) {
    $(function () {
        // inner handler
    });
    // outer handler
});

内部ready处理程序中的代码在外部处理程序中的代码之后执行:http: //jsfiddle.net/nmD8b/

jQuery(document).ready(function($) {
    (function () {
        // do something
    })();
    // outer handler
});

立即函数表达式中的代码在定义函数的地方执行,即在表达式后面的代码之前执行:http: //jsfiddle.net/nmD8b/


如果要限定变量的范围,请使用第二种方式。第一种方法没有多大意义,您应该只ready在实际需要时注册事件处理程序。在这种情况下,DOM 已经就绪,因为您将处理程序绑定到另一个就绪处理程序中。

如果您不想定义变量的范围,请不要使用它们。只需将所有代码放在外部处理程序中。

于 2012-11-01T18:29:08.103 回答
1
jQuery(document).ready(function($) {

&&

$(function () {

是一样的吗

除了第二个仅适用于 jQuery 1.0+ (我认为,如果错了,有人纠正)

此外

the$jQuery命名空间的简写符号。因此jQuery(与 相同$(。然后你可以写$(document)which 与 相同jQuery(document),其中 the$是命名空间的简写,()feed 给定的参数,在这种情况下,document在 javascript 中是相同的。

$(function是 jQuery 的 doc.ready 调用函数,正常的返回就是通常所说的jQuery Object. 其中 index 0 是通过的元素,其他一切要么是原生 js 在该元素上返回,要么是 jquery 道具和方法。

于 2012-11-01T18:27:10.747 回答
1

正如大家所说:

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

// is the document.ready as:

jQuery(function ($) { }); // <-- this is the short-hand version

// the $ inside the parenthesis really just means that $ is to refer to jQuery inside.
// you could just do:

$(function () { }); // if you know it will be anyway 

使用即时函数更适用于在常规 Javascript 中创建“类”/“命名空间”等。

(function (myNamespace) {

    function myNamespace () { }
    return myNamespace;

}(window.myNamespace = window.myNamespace || {}));
于 2012-11-01T18:32:12.750 回答
1
  • 在文档准备好后的任何时候使用$(function () {});都是非常安全的,指定的函数会立即触发。报价

如果在 DOM 初始化后调用 .ready() ,传入的新处理程序将立即执行。

注意:正如 Felix 所指出的,jQuery 似乎可以防止嵌套调用.ready().

  • (function () {})()无论是在文档就绪事件内部还是外部,使用都按预期工作。它 (i) 创建一个闭包 (ii) 立即触发 (iii) 不关心文档是否准备好。

第一个是多余的,所以 IMO 第二个更好。

实际上,如果您不需要闭包,则将函数设为内联;$(function () {});自己作为一个闭包。

于 2012-11-01T18:33:09.590 回答
0

鉴于这$(function() {})是 的别名$.ready,您的第一个示例只是$.ready包裹在 a$.ready中,这实际上没有任何意义,即使我认为它不会对性能产生任何严重影响。

您的第二个示例是人们通常在其 JavaScript 文件的最外层执行的操作,以防止污染全局变量范围

;(function($) {
    $(document).ready(function() {
        // Do something
    });
})(jQuery);

这是迄今为止我在大多数 JavaScript 文件中看到的内容。它可以防止全局变量范围污染,并确保即使在模式下也$实际引用。jQuerynoConflict


需要注意的重要一点是,如果您在结束标记之前加载 JavaScript(这样做也会缩短页面加载时间$.ready,那么您实际上并不需要它。</body>

于 2012-11-01T18:26:33.267 回答