2010-07-20 56 views
1

如果使用jQuery的

$(function() { ... }) 

添加功能被執行時,DOM是準備有2個或3或20的語句,將所有這些功能並行運行或按順序運行?

回答

5

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部分。

+0

基於上面的代碼,它看起來像文檔一旦準備就緒,您不能再添加到隊列的末尾 - 所有新的就緒處理程序將立即執行。這意味着它不是完​​全綁定的順序,因爲準備好後的綁定會立即執行。 – 2011-02-01 17:32:54

+1

@肖恩 - 他們仍然在命令:) – 2011-02-01 18:01:29

3

它們將按順序運行。你可以把斷點螢火看到這種行爲

+0

我不認爲使用斷點是一個確鑿的測試。例如,您可以在Eclipse中爲多個線程放置斷點,並且調試器將停止在每個斷點處。區別因素是當前正在執行的線程被列出。如果情況並非如此,那麼如果代碼以線程化方式執行,則無法輕易說出。 – Anurag 2010-07-20 22:47:59

3

它們將按順序運行。 Javascript代碼不能並行運行。

+0

在這種情況下,這是真的,但作爲一個總括聲明它不*完全*真實的,[bobince](http://stackoverflow.com/users/18936/bobince )在這裏對異常做了很好的寫作:http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded – 2010-07-20 22:45:19

+1

@Nick:看起來更像是執行被某些事件中斷案件,而不是實際並行運行。 – Guffa 2010-07-20 23:02:44

+0

Javascript代碼不能並行運行?如果你每0.1秒有2個'setInterval()'一個,每0.11秒另一個呢,那麼2個函數在某個點上不會並行運行? (比如2個線程) – 2010-07-20 23:10:04