JavaScript 定時器函式非同步原理

admin發表於2018-12-10

JavaScript當前有兩個定時器函式,setTimeout與setInterval方法。

量方法具體用法參閱如下兩篇文章:

(1).setTimeout參閱JavaScript setTimeout()詳解一章節。

(2).setInterval參閱JavaScript setInterval()一章節。

首先再來明確一下什麼非同步操作,非同步操作的有點是什麼。

所謂非同步操作就是在同一時刻可以做多件事情,而不是所有事情在同一個佇列排隊等待執行。

大家最為熟知的一個就是ajax非同步請求,當向伺服器請求資料的時候,不會堵塞其他程式碼的執行。

明晰了非同步操作的特點,那麼它的有點也不言而明,同一時刻可以做多件事情自然比同一時刻只能做一件事情要好。

如果JavaScript沒有非同步操作,那麼將會寸步難行,會被卡死。

大家都知道setTimeout與setInterval方法可以實現非同步操作,可能還有一點疑問。

首先看一段程式碼例項:

[JavaScript] 純文字檢視 複製程式碼
function front(){
  // code
}
front();

setTimeout(function(){
  // code
},5000);

假設front方法執行需要花費4秒時間,程式碼分析如下:

(1).JavaScript是單執行緒的,這個應該沒有什麼疑問。

(2).front方法執行完畢後,再過1秒,定時器的回撥函式就會執行,這是司空見慣的操作。

(3).下面按照JavaScript是單執行緒這理論去解析程式碼,既然是單執行緒的,當front的方法執行的時候,定時器函式肯定沒有得到執行,只有當front函式執行完畢,setTimeout方法再去執行,然後5秒後執行它的回撥函式,這很明顯與事實不符。

(4).原因是這樣的,雖然JavaScript是單執行緒的,但是它的執行環境,也就是瀏覽器是多執行緒的,時間計數並不是由JavaScript現成來完成,而是由瀏覽器的某個現成完成,所以定時器函式能夠實現非同步操作。

關於非同步操作的更多內容可以參閱JavaScript 非同步操作原理一章節。

相關文章