Javascript $(document).ready(function(){…})中的自调用函数;

Javascript $(document).ready(function(){…})中的自调用函数;,javascript,jquery,Javascript,Jquery,我已经将我的javascript封装在 jQuery(document).ready(function($) { }); 我想知道通过以下两种方式调用it内部函数的含义: jQuery(document).ready(function($) { $(function () { // do something }); }); vs 编辑: 我还想知道这两种方式中哪一种更“正确”呢?请随意添加您自己的实现。鉴于$(function(){})是$的别名。ready

我已经将我的javascript封装在

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

});
我想知道通过以下两种方式调用it内部函数的含义:

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

编辑:

我还想知道这两种方式中哪一种更“正确”呢?请随意添加您自己的实现。

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

第二个示例是人们通常在JavaScript文件的最外层执行的操作,以防止:

到目前为止,我在大多数JavaScript文件中都看到了这一点。它可以防止全局变量范围污染,并确保即使在
noConflict
模式下,
$
实际上也引用了
jQuery


关于
$.ready
需要注意的一件重要事情是,如果在关闭
标记之前加载JavaScript,那么实际上并不需要它(这样做也会提高性能)

&&

都是一样的

除了第二个,它只适用于jQuery1.0+(我想,如果有人错了,一定会纠正的)

此外

$
jQuery
名称空间的简写符号。因此,
jQuery(
$(
)相同。然后您可以编写
$(document)
,这将与
jQuery(document)
相同,其中
$
是名称空间的缩写,
()
输入给定的参数,在本例中,该参数是
document
,在javascript中是相同的

(function (myNamespace) {

    function myNamespace () { }
    return myNamespace;

}(window.myNamespace = window.myNamespace || {}));

$(function
是jQuery的doc.ready调用函数,正常返回通常被称为
jQuery对象
。其中索引0是传递的元素,其他所有内容都是该元素上的本机js返回或jQuery道具和方法。

不同之处在于执行顺序:

jQuery(document).ready(function($) {
    $(function () {
        // inner handler
    });
    // outer handler
});
内部ready处理程序中的代码在外部处理程序中的代码之后执行:

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


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


如果您不想定义变量的作用域,请不要使用这两个变量。只需将所有代码放在外部处理程序中即可。

正如大家所说:

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 
  • 使用
    $(函数(){});
    在文档准备就绪后的任何时候都是完全安全的,指定的函数将立即启动:
如果在初始化DOM后调用.ready(),则新的 传入的处理程序将立即执行

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

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


事实上,如果您不需要闭包,那么将函数内联;
$(function(){});
本身充当闭包。

第一个示例将另一个函数添加到函数的
就绪
队列中(如果我记得正确的话)。第二种方法只是创建一个自动执行的匿名函数。我建议使用第二种方法,因为它们做的事情几乎相同。通过OP使用的方法可以更容易地实现这一点:
jQuery(document).ready(function($){…});
@FelixKling它可能更容易,也可能不容易,但肯定不是更灵活(也就是说,你必须使用
$.ready
,如果我在页面末尾加载我的东西,我就不需要使用它了。另外,我的示例是由页面建议的。我刚才谈到了DOM ready事件的范围。插件是另一回事;)啊,我明白了。我想我这样做是因为他在他的例子中已经使用了类似的构造,然后我的大脑连接到了jQuery插件。尽管如此,我通常用这种方式封装我的所有JavaScript文件,因为即使这不是最简单的方式,它至少是一致的:)
$(function () {
jQuery(document).ready(function($) {
    $(function () {
        // inner handler
    });
    // outer handler
});
jQuery(document).ready(function($) {
    (function () {
        // do something
    })();
    // outer handler
});
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 
(function (myNamespace) {

    function myNamespace () { }
    return myNamespace;

}(window.myNamespace = window.myNamespace || {}));