咨詢電(diàn)話(huà):023-88959644    24小(xiǎo)時(shí)服務熱線:400-023-8809
NEWS CENTER ·
新聞動态
關注中技(jì)互聯 關注前沿

setTimeout 的黑(hēi)魔法

發表日期:2016-05-03    文章編輯:重慶網站(zhàn)建設小(xiǎo)編    浏覽次數(shù):22    标簽:

  setTimeout,前端工程師(shī)必定會(huì)打交道(dào)的一個(gè)函數(shù).它看上(shàng)去非常的簡單,樸實.有(yǒu)着一個(gè)很(hěn)不平凡的名字--定時(shí)器(qì).讓年少(shǎo)的我天真的以為(wèi)自己可(kě)以操縱未來(lái).卻不知樸實之中隐含着驚天大(dà)密.我還(hái)記得(de)我第一次用這個(gè)函數(shù)的時(shí)候,我天真的以為(wèi)它就是js實現多(duō)線程的工具.當時(shí)用它實現了一個(gè)坦克大(dà)戰的小(xiǎo)遊戲,玩兒不亦樂乎.可(kě)是随着在前端這條路上(shàng)越走越遠,對它理(lǐ)解開(kāi)始産生(shēng)了變化.它似乎開(kāi)始蒙上(shàng)了面紗,時(shí)常有(yǒu)一些(xiē)奇怪的表現讓我捉摸不透.終于,我的耐心耗盡,下定決心,要撕開(kāi)它的面具,一探究竟.
  setTimeout() 方法用于在指定的毫秒(miǎo)數(shù)後調用函數(shù)或計(jì)算(suàn)表達式。
  js是沒有(yǒu)多(duō)線程的.js引擎的執行(xíng)是單線程執行(xíng).這個(gè)特性曾經困擾我很(hěn)久,我想不明(míng)白既然js是單線程的,那(nà)麽是誰來(lái)為(wèi)定時(shí)器(qì)計(jì)時(shí)的?是誰來(lái)發送ajax請(qǐng)求的?我陷入了一個(gè)盲區(qū).即将js等同于浏覽器(qì).我們習慣了在浏覽器(qì)裏面執行(xíng)代碼,卻忽略了浏覽器(qì)本身.js引擎是單線程的,可(kě)是浏覽器(qì)卻可(kě)以是多(duō)線程的,js引擎隻是浏覽器(qì)的一個(gè)線程而已.定時(shí)器(qì)計(jì)時(shí),網絡請(qǐng)求,浏覽器(qì)渲染等等.都是由不同的線程去完成的。
  js引擎單線程執行(xíng)的,它是基于事件驅動的語言.它的執行(xíng)順序是遵循一個(gè)叫做(zuò)事件隊列的機制(zhì).從圖中我們可(kě)以看出,浏覽器(qì)有(yǒu)各種各樣的線程,比如事件觸發器(qì),網絡請(qǐng)求,定時(shí)器(qì)等等.線程的聯系都是基于事件的.js引擎處理(lǐ)到與其他線程相關的代碼,就會(huì)分發給其他線程,他們處理(lǐ)完之後,需要js引擎計(jì)算(suàn)時(shí)就是在事件隊列裏面添加一個(gè)任務. 這個(gè)過程中,js并不會(huì)阻塞代碼等待其他線程執行(xíng)完畢,而且其他線程執行(xíng)完畢後添加事件任務告訴js引擎執行(xíng)相關操作(zuò).這就是js的異步編程模型.
  本文由重慶網站(zhàn)建設-中技(jì)互聯:www.zjcoo.com
如沒特殊注明(míng),文章均為(wèi)中技(jì)互聯原創,轉載請(qǐng)注明(míng)來(lái)自www.zjcoo.com
相關新聞

CopyrightZJCOO technology Co., LTD. All Rights Reserved.    

渝ICP 備11003429号

  • qq客服
  • 公衆号
  • 手機版
  • 新浪微博