最近在閱讀《你不知道的JavaScript中卷》,當我看到第二部分介紹異步和回調(diào)函數(shù)的一些知識時,由于該書在第二部分1、2章對線程、事件循環(huán)的概念介紹的并非詳細,因此引發(fā)了我的一系列思考。于是寫下這篇小文章,記錄自己對該知識點的學習和思考。
什么是線程
由于JavaScript是單線程語言,因此,在一個進程上,只能運行一個線程,而不能多個線程同時運行。也就是說JavaScript不允許多個線程共享內(nèi)存空間。因此,如果有多個線程想同時運行,則需采取排隊的方式,即只有當前一個線程執(zhí)行完畢,后一個線程才開始執(zhí)行。JavaScript中的線程包括函數(shù)調(diào)用、I/O設備(如向服務器發(fā)送請求獲取響應等)、定時器、用戶操作的事件(click、keyup、scroll等)。
由于每個線程需要排隊執(zhí)行,因此涉及堆(Heap)、棧(Stack)、隊列(Queue)的概念。
Heap、Stack、Queue
在MDN上的一篇文章《并發(fā)模型與Event Loop》,介紹了關于這三個概念
堆(Heap):對象被分配在一個堆中,一個用以表示一個內(nèi)存中未被組織的區(qū)域。我們知道,函數(shù)是第一等對象,同時函數(shù)是“可調(diào)用的對象”。因此,當函數(shù)在被調(diào)用之前,JavaScript引擎會對函數(shù)進行編