setTimeout的異步的實現原理

轉自:http://blog.csdn.net/aitangyong/article/details/46800615瀏覽器

今天看了下Promise的使用,提到了setTimeout的異步實現,看到上文,很是有幫助理解,mark一下。異步

重點以下:函數

JavaScript是單線程執行的,沒法同時執行多段代碼。當某一段代碼正在執行的時候,全部後續的任務都必須等待,造成一個隊列。一旦當前任務執行完畢,再從隊列中取出下一個任務,這也常被稱爲 「阻塞式執行」。因此一次鼠標點擊,或是計時器到達時間點,或是Ajax請求完成觸發了回調函數,這些事件處理程序或回調函數都不會當即運行,而是當即排隊,一旦線程有空閒就執行。假如當前 JavaScript線程正在執行一段很耗時的代碼,此時發生了一次鼠標點擊,那麼事件處理程序就被阻塞,用戶也沒法當即看到反饋,事件處理程序會被放入任務隊列,直到前面的代碼結束之後纔會開始執行。若是代碼中設定了一個 setTimeout,那麼瀏覽器便會在合適的時間,將代碼插入任務隊列,若是這個時間設爲 0,就表明當即插入隊列,但不是當即執行,仍然要等待前面代碼執行完畢。因此 setTimeout 並不能保證執行的時間,是否及時執行取決於 JavaScript 線程是擁擠仍是空閒。.net

相關文章
相關標籤/搜索