你必須知道的Javascript知識點之”單線程事件驅動”的使用

來源:互聯網
上載者:User

複製代碼 代碼如下: var intervalBody = function(){
console.log('interval');
}

var startInterval = function(){
setInterval(intervalBody,1000);
}

var timeoutBody = function(){
console.log('timeout');
}

var startTimeout = function(){
setTimeout(timeoutBody,1000);
}

var sleep = function(second){
var current = new Date().setSeconds(new Date().getSeconds() + second);
while(new Date() < current){ }
}

startInterval();
startTimeout();
sleep(2);
console.log('sleep once');
sleep(2);
console.log('sleep again');

執行結果

發生了什麼事情

執行規則規則1

事件驅動的單執行緒模式,所有javascript的代碼都在一個線程中執行,javascript線程從事件隊列中一次取出一個事件進行執行。

規則2

宿主中除了javascript線程外,還有定時器線程(setInterval和setTimeout會觸發這兩個線程執行)、瀏覽器事件觸發線程(這個線程會觸發onclick、onmousemove和其它瀏覽器事件)、AJAX請求線程;所有這些線程觸發的事件(回調)都會加入到事件隊列的尾部。

規則3

當瀏覽器載入完html文檔後,會將當前html的所有的js代碼作為事件隊列的第一個事件,其它線程觸發的事件(回調)都會加入到事件隊列的尾部。

規則4

setTimeout和setInterval中的回調的執行時間肯定是大於為其指定的秒數。

瀏覽器渲染線程

假如javascript執行線程執行了A事件,在A事件執行的過程中修改了DOM,這些DOM的修改不會立即反應到介面上,而是當A事件執行完畢後,javascript線程會被阻塞,這時瀏覽器渲染線程會渲染DOM的修改結果,等瀏覽器渲染線程執行完畢後,javascript線程才繼續運行。

程式碼範例

複製代碼 代碼如下:var sleep = function(second){
var current = new Date().setSeconds(new Date().getSeconds() + second);
while(new Date() < current){ }
}

document.body.innerHTML = '段光偉';
sleep(5);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.