【问题标题】:jQuery's ready queue $(foo) and $(bar) will run in sequence or run in parallel?jQuery的就绪队列$(foo)和$(bar)是顺序运行还是并行运行?
【发布时间】:2010-07-20 22:30:44
【问题描述】:

如果有 2 或 3 或 20 条语句使用 jQuery 的

$(function() { ... })

在DOM准备好时添加要执行的函数,所有这些函数是并行运行还是顺序运行?

【问题讨论】:

    标签: jquery document-ready domready


    【解决方案1】:

    document.ready 在这方面表现得像一个正常事件,它们按顺序发生并且按照它们被绑定的顺序。可以看the relevant jQuery core source here

    当您执行$(function) 时会发生这种情况:

    ready: function( fn ) {
        jQuery.bindReady();
        if ( jQuery.isReady ) {
            fn.call( document, jQuery );
        } else if ( readyList ) {
            readyList.push( fn );
        }
        return this;
    }
    

    这会在稍后触发“就绪”事件时发生:

    if ( readyList ) {
        var fn, i = 0;
        while ( (fn = readyList[ i++ ]) ) {
            fn.call( document, jQuery );
        }
        readyList = null;
    }
    

    如果文档已经准备就绪,函数会立即执行,即上面第一个代码块中的if 部分。

    【讨论】:

    • 基于上面的代码,看起来一旦文档准备好了,你就不能再添加到队列的末尾了——所有新的准备好的处理程序都会立即执行。这意味着它不完全是绑定顺序,因为后准备绑定将立即执行。
    • @Sean - 他们仍然按照所谓的顺序:)
    【解决方案2】:

    它们将按顺序运行。您可以在 firebug 中设置断点以查看此行为

    【讨论】:

    • 我不认为使用断点是一个决定性的测试。例如,您可以使用 Java 在 Eclipse 中为多个线程设置断点,调试器将在每个断点处停止。那里的区别因素是列出了当前正在执行的线程。如果不是这种情况,那么您将无法轻易判断代码是否以线程方式执行。
    【解决方案3】:

    它们将按顺序运行。 Javascript 代码不会并行运行。

    【讨论】:

    • 在这种情况下确实如此,但作为一个笼统的陈述,它并非完全正确,bobince 在此处对异常进行了出色的撰写:stackoverflow.com/questions/2734025/…
    • @Nick:这看起来更像是在某些情况下执行被事件中断,而不是实际并行运行。
    • Javascript 代码不能并行运行?如果您每 0.1 秒有 2 个 setInterval() 一个,每 0.11 秒有一个,那么 2 个函数在某个时候不会并行运行吗? (如 2 个线程)
    • @Jian Lin 不,确切的超时/间隔不能保证,如果线程很忙(记住你只有其中一个 - 除了网络工作者!)它是队列
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2019-10-07
    相关资源
    最近更新 更多