Javascript 为什么$()准备就绪(处理程序)“;不推荐吗?

Javascript 为什么$()准备就绪(处理程序)“;不推荐吗?,javascript,jquery,callback,document-ready,Javascript,Jquery,Callback,Document Ready,从forready 以下三种语法都是等效的: $(文档).ready(处理程序) $().ready(处理程序)(不建议这样做) $(处理程序) 在做了家庭作业——阅读和玩耍之后,我不知道为什么 $().ready(handler) 不建议使用。第一种方法和第三种方法完全相同,第三种方法使用文档对缓存的jQuery对象调用ready函数: rootjQuery = jQuery(document); ... ... // HANDLE: $(function) // Shortcut

从for
ready

以下三种语法都是等效的:

  • $(文档).ready(处理程序)
  • $().ready(处理程序)(不建议这样做)
  • $(处理程序)
在做了家庭作业——阅读和玩耍之后,我不知道为什么

$().ready(handler) 
不建议使用。第一种方法和第三种方法完全相同,第三种方法使用
文档
对缓存的jQuery对象调用ready函数:

rootjQuery = jQuery(document);
...
...

// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
    return rootjQuery.ready( selector );
}
但是ready函数与所选节点元素的选择器没有交互作用,
ready
源代码:

ready: function( fn ) {
    // Attach the listeners
    jQuery.bindReady();
        // Add the callback
    readyList.add( fn );
        return this;
},
如您所见,它只是将回调添加到内部队列(
readyList
),而不更改或使用集合中的元素。这使您可以对每个jQuery对象调用
ready
函数

比如:

  • 常规选择器:
    $('a')。就绪(处理程序)
  • 无意义选择器:
    $('fdhjjkdafdsjkjriohfjdnfj').ready(handler)
  • 未定义的选择器:
    $()。就绪(处理程序)

最后。。。对于我的问题:为什么不建议使用
$().ready(handler)

由于不同的选项所做的事情与您指出的几乎相同,现在是时候戴上library writer帽子并进行一些猜测了

  • 也许jQuery人员希望将来可以使用
    $()
    (值得怀疑,因为
    $().ready
    是有文档记录的,即使不建议使用;如果有特殊情况,它也会污染
    $
    的语义)

  • 一个更实际的原因是:第二个版本是唯一一个没有包装
    文档的版本,因此在维护代码时更容易被破坏。例如:

    // BEFORE
    $(document).ready(foo);
    
    // AFTER: works
    $(document).ready(foo).on("click", "a", function() {});
    
    将此与

    // BEFORE
    $().ready(foo);
    
    // AFTER: breaks
    $().ready(foo).on("click", "a", function() {});
    
  • 与上述内容相关:
    ready
    是一个怪胎,因为无论jQuery对象包装什么,它(唯一?)方法都会以相同的方式工作(即使它没有像这里那样包装任何内容)。这是与其他jQuery方法的语义的一个主要区别,因此不鼓励特别依赖它

    更新:正如Esailija的评论所指出的,从工程角度来看,
    ready
    应该是一种静态方法,因为它的工作原理是这样的


  • 更新#2:挖掘源代码,似乎在1.4分支
    $()
    中的某个点被更改为匹配
    $([])
    ,而在1.3中它的行为类似于
    $(文档)
    。这一更改将强化上述理由。

    我想说,这只是因为
    $()
    返回了一个空对象,而
    $(文档)
    没有,所以您将
    ready()
    应用于不同的事物;它仍然有效,但我认为它不是直观的

    $(document).ready(function(){}).prop("title") // the title
    $().ready(function(){}).prop("title")  //null - no backing document
    

    我认为这实际上是为了可读性而不是其他任何东西

    这张没有那么有表现力

    $().ready(handler);
    
    作为


    也许他们正试图推广某种形式的惯用jQuery。

    只是为了清楚地表明这三种形式之间存在一些不一致,加上我添加了第四种常用形式:
    (function($){}(jQuery))

    使用此标记:

    <div >one</div>
    <div>two</div>
    <div id='t'/>
    
    上一条语句中div的显示结果为:0:9:9:9:undefined

    因此,只有Handler和Doc版本与jQuery约定一致,即在获取文档选择器时返回有用的内容,并且对于传递的表单,您必须返回一些内容(我认为我不会这样做,但将其放进去只是为了显示“内部”有一些内容)


    这里有一个供好奇者使用的小提琴版本:

    这很可能只是一个文档错误,应该加以修复,使用
    $()的唯一缺点是它的可读性。当然,有人认为
    $(handler)
    同样不可读。我同意,这就是我不使用它的原因

    你也可以说一种方法比另一种更快。但是,您在单个页面上的一行中调用此方法的次数是否足以注意到差异


    归根结底,这取决于个人偏好。除了readability参数外,使用
    $().ready(handler)
    没有任何缺点。我认为文档在本例中没有引导。

    我从一位jQuery开发人员那里得到了一个正式答案:


    $().ready(fn)
    之所以有效,是因为
    $()
    曾经是
    $(文档)
    的快捷方式(jQuery@ChaosPandion:对我来说,他似乎在努力理解他所使用的工具,就像在他的手背上一样。我不认为这是白费力气。问得好。如果有人感兴趣(至少在Chrome中)“未推荐”版本实际上是最快的。一个更好的问题是为什么会存在这些,它应该是一个静态方法(例如,
    $.ready
    )而且一开始不需要构造jQuery对象。@Esailija是最好的选择。除非jQuery计划提供某种类型的
    .ready()
    对于单个元素的功能,应该没有理由构造jQuery对象。@chaosption。你不能使用…
    $。ready
    已被内部jQuery函数使用,请在源代码中搜索
    ready:
    。但我从未见过这样的代码,以前的习惯用法是
    $(文档)。ready(函数(){//your code here});
    我无法理解第二次更新,您能详细说明一下吗?我搜索了旧版本,但找不到这个空jQuery对象问题的任何区别。@gdoron:我是说从
    selector=selector | | document
    更改为
    if(!selector)退回此
    。是的,同样的看法也存在。因此,在发布新退货政策的1.4版中进行了更改
    <div >one</div>
    <div>two</div>
    <div id='t'/>
    
    var howmanyEmpty = $().ready().find('*').length;
    var howmanyHandler = $(function() {}).find('*').length;
    var howmanyDoc = $(document).ready().find('*').length;
    var howmanyPassed = (function($) { return $('*').length; }(jQuery));
    var howmanyYuck = (function($) {}(jQuery));
    var howmanyYuckType = (typeof howmanyYuck);
    
    $(document).ready(function() {
        $('#t').text(howmanyEmpty + ":" + howmanyHandler + ":" 
            + howmanyDoc + ":" + howmanyPassed + ":" + howmanyYuckType);
    });