Javascript:猜猜彈出的是啥?為啥?

來源:互聯網
上載者:User
背景

經常需要向新入職的年輕同學解釋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規範,所以大家要謹慎理解。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.