背景
經常需要向新入職的年輕同學解釋Javascript的兩個概念:單線程和範圍鏈,今天就再寫篇部落格說明一下。
單線程
- 隊列:只有一個用來儲存回調方法的隊列。
- 消費線程:只有一個消費線程,不停的從隊列中取方法,然後進行調用。這也是為什麼Javascript稱作為單線程的原因。
- 生產線程:有多個生產線程,不同的向隊列中插入方法,常見的產生線程有:定時器、Ajax和瀏覽器事件。這也是為什麼Javascript稱作為事件驅動的原因。
參考文章:http://www.cnblogs.com/happyframework/archive/2013/04/23/3035596.html。
範圍鏈條
局部變數不是儲存在“棧”中的,不要試著用傳統的“棧”式範圍來理解。
參考文章:http://www.cnblogs.com/happyframework/archive/2013/04/22/3034087.html。
樣本
1 function sleep(millisecond){ 2 var start = new Date(); 3 while(new Date().getTime() - start.getTime() <= millisecond) {} 4 } 5 6 var a = 6; 7 setTimeout(function () { 8 alert(a); 9 a = 666;10 }, 0);11 sleep(5000);12 a = 66;
這個例子的執行過程向隊列裡插入了2快代碼:
第一塊:sleep定義、局部變數a定義和賦值、setTimeout方法調用、sleep方法調用和a賦值。
第二塊:setTimeout的第二個參數(匿名函數)的調用。
根據這個可以知道,匿名函數的執行是在a = 66之後執行的,結合範圍鏈的知識,可以知道彈出的結果是66。
備忘
寫的還不夠清晰,基本上是QQ裡聊天的內容,有些概念是我在網上找的,沒有看Javascript規範,所以大家要謹慎理解。