关于多个ready()的问题

bgc*_*ode 25 javascript jquery

假设我有:

<script src="script1.js"></script>
<script src="script2.js"></script>
Run Code Online (Sandbox Code Playgroud)

这两个脚本都ready()在里面.script2.js中的代码ready()总是会在第一个代码之后执行吗?

Fel*_*ing 29

是.

首先,代码script2.js将在之后执行script1.js,因为它在文档中稍后出现(并且未设置defer属性).

此外,实施[源]所述的ready功能是:

ready: function( fn ) {
    // Attach the listeners
    jQuery.bindReady();

    // Add the callback
    readyList.done( fn );

    return this;
},
Run Code Online (Sandbox Code Playgroud)

其中readyList 似乎是[source]一个延迟对象[docs].这意味着回调按照它们添加到该对象的顺序执行.


pim*_*vdb 14

jQuery Deferred为此使用自己的对象.适当的jQuery代码证明它按顺序执行:

当你打电话时.ready,该功能被添加到readyList:

readyList.done( fn );
Run Code Online (Sandbox Code Playgroud)

当DOM准备就绪时,执行以下功能:

readyList.resolveWith( document, [ jQuery ] );
Run Code Online (Sandbox Code Playgroud)

resolveWith函数包含此代码,该代码执行作为回调添加的函数:

while( callbacks[ 0 ] ) {
    callbacks.shift().apply( context, args );
}
Run Code Online (Sandbox Code Playgroud)

如您所见,回调函数被shift编辑(从回调数组的开头弹出(即readyList)),因此第一个函数在第二个之前执行.