2011-07-10 33 views
25

假设我有:问题有关多准备()

<script src="script1.js"></script> 
<script src="script2.js"></script> 

这些脚本双方都有ready()内。 script2.js的ready()中的代码是否会在第一个代码后执行?

回答

29

是。

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

此外,ready功能的the implementation [source]是:

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

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

    return this; 
}, 

其中readyListseems to be [source]一个deferred object [docs]。这意味着回调会按照它们添加到该对象的顺序执行。

+1

菲利克斯干得好。我只是看着未压缩代码的那部分,试图找出如何解释它... –

+0

感谢您的伟大答案 – babonk

2

准备好多个文档将被解雇。

0

.ready()函数被调用的第一个注册获得第一处理基础

+0

我想看到一些源归属...据我所知,它是用for..in循环完成的,这意味着它使用集合上的迭代器,这是您无法使用的顺序。 – jcolebrand

14

jQuery为此使用自己的Deferred对象。 jQuery的适当代码证明它是为了执行:

当你调用.ready,该功能被添加到readyList

readyList.done(fn); 

当DOM准备就绪后,执行该功能:

readyList.resolveWith(document, [ jQuery ]); 

resolveWith功能包含此码,其执行添加作为回调函数:

while(callbacks[ 0 ]) { 
    callbacks.shift().apply(context, args); 
} 

正如您所看到的,回调函数是shift ed(从回调数组的开头弹出(即readyList)),所以第一个在第二个之前执行。

+0

很好的解释。 :) –

+0

感谢您的信息,upvoting – babonk