97国产精品视频人人做人人爱,3344在线观看无码,成年人国产视频,欧美日一级片,在线看AV天堂,高清无码一本到东京热,欧美一级黄片一区2区,免费又爽又刺激高潮网址

你不知道的JavaScript:有趣的setTimeout

2018-5-7    周周

     話不多說,先上代碼

     for(var j=0;j<10;J++){

         setTimeout(function(){console.log(j);},5000)

     }

     看到這三行代碼,你也許會不耐煩道:又要講閉包?要吐槽了好么?別急,讓我們先來思考一下,這段代碼在瀏覽器中的執(zhí)行結(jié)果是什么?

     <!-- more -->

     甲:順序打印0到9?

     乙:這題我見過,打印十個10!

     哪個答案正確?

     執(zhí)行結(jié)果顯示,瀏覽器打印出十個10,貌似乙對了,但是如果你足夠細心,你會發(fā)現(xiàn)幾個問題:為什么會循環(huán)打印十個10,而不是0到9?

     從結(jié)果來看,for循環(huán)執(zhí)行完跳出之后,才開始執(zhí)行setTimeout(所以j才等于10),為什么不是每次迭代都執(zhí)行一次setTimeout呢?

1、為什么會循環(huán)打印十個10?

      許多人習(xí)慣用第二個問題中的執(zhí)行結(jié)果來回答這個問題:“for循環(huán)執(zhí)行完畢跳出之后才開始執(zhí)行setTimeout,所以才打印了十個10”。這樣的答案,只能說是既應(yīng)付了自己,又應(yīng)付了別人。其實,要解答第一個問題,首先要解答第二個問題。

2、為什么不是每一次迭代都執(zhí)行一次setTimeout?

     大家都知道,JavaScript在ES6出現(xiàn)以前,是沒有塊狀作用域的,這就意味著,在for循環(huán)中用var定義的變量j,其實是屬于全局的,那其實整個全局作用域中只有一個j,每次for循環(huán)都是更新這個j。

       那么現(xiàn)在的關(guān)鍵問題在于,為什么整個for循環(huán)會先于setTimeout執(zhí)行,而不是我們正常理解的,一次迭代執(zhí)行一次。這就涉及到了JavaScript的核心特性:單線程。

       JavaScript設(shè)計的初衷,是瀏覽器用來與用戶進行交互和DOM操作的,這就決定了它必須是單線程的。設(shè)想JavaScript同時有兩個線程,一個線程在DOM節(jié)點內(nèi)添加內(nèi)容,一個線程刪除該節(jié)點,瀏覽器就會出現(xiàn)混亂。所以,為了避免復(fù)雜性,從一誕生,JavaScript就是單線程,這已經(jīng)成為了這門語言的核心特征,將來也不會改變。

      單線程就意味著,所有任務(wù)需要排隊,前一個任務(wù)結(jié)束,才會執(zhí)行下一個任務(wù),如果前一個任務(wù)耗時很長,后一個任務(wù)就不得不一直等著。

      為了優(yōu)化單線程的性能,JavaScript將任務(wù)分成兩種,一種是同步任務(wù)(synchronous),另一種是異步任務(wù)(asynchronous)。同步任務(wù)指的是,在主線程上排隊執(zhí)行的任務(wù),只有前一個任務(wù)執(zhí)行完畢,才能執(zhí)行后一個任務(wù);異步任務(wù)指的是,不進入主線程,而進入“任務(wù)隊列(task queue)”的任務(wù),只用主線程中的同步任務(wù)執(zhí)行完畢,異步任務(wù)才會進入執(zhí)行隊列執(zhí)行。只要主線程空了,就會去讀取“任務(wù)隊列”,這就是JavaScript的運作機制。這個過程會不斷重復(fù)。

       而setTimeout就被JavaScript定義為異步任務(wù)。每次for循環(huán)的迭代,都將setTimeout中的回調(diào)函數(shù)加入任務(wù)隊列等待執(zhí)行。也就是說,只有同步任務(wù)中的for循環(huán)完全結(jié)束,主線程中才會去任務(wù)列表中找到尚未執(zhí)行的十個setTimeout(十次迭代)回調(diào)函數(shù)并順序執(zhí)行(先進先出)。而此時,j已經(jīng)經(jīng)過循環(huán)結(jié)束變成了10,所以此時主線程執(zhí)行的,是十個一模一樣的打印i的回調(diào)函數(shù),即打印十個10,。至此完美回答了第一和第二個問題,文章開頭的代碼與下面的代碼其實是等價的:

       for(var i=0;i<10;i++){

            setTimeout(console.log(i),5000);

            setTimeout(console.log(i),5000);

            setTimeout(console.log(i),5000);

            setTimeout(console.log(i),5000);

            setTimeout(console.log(i),5000);

            setTimeout(console.log(i),5000);

            setTimeout(console.log(i),5000);

            setTimeout(console.log(i),5000);

            setTimeout(console.log(i),5000);

            setTimeout(console.log(i),5000);

}

       小小的一個setTimeout,牽扯出了很多JavaScript的深層次問題,可見JavaScript還有許多地方是值得深入探究的。



日歷

鏈接

個人資料

藍藍設(shè)計的小編 http://m.0391cbd.com

存檔

主站蜘蛛池模板: 国产午夜一级淫片| 2019年国产精品自拍不卡| 国产精彩视频在线观看| 国产va在线观看免费| 国产成人精品高清在线| 成人va亚洲va欧美天堂| 国产SUV精品一区二区6| 欧美午夜在线观看| 久久久久久久久久国产精品| 亚洲精品国产综合99久久夜夜嗨| 自拍欧美亚洲| 一级毛片基地| 久久综合干| 欧美无遮挡国产欧美另类| 国产无遮挡猛进猛出免费软件| 不卡午夜视频| 国产日韩欧美在线播放| 日韩欧美高清视频| 欧美午夜久久| 看国产毛片| 波多野结衣一区二区三区四区| 成人精品免费视频| 国产无人区一区二区三区| 97视频精品全国免费观看| 丰满的熟女一区二区三区l| 久久国产免费观看| 天堂久久久久久中文字幕| 强乱中文字幕在线播放不卡| 九九久久精品免费观看| 亚洲伊人久久精品影院| 欧美乱妇高清无乱码免费| 在线精品亚洲一区二区古装| 小说 亚洲 无码 精品| 日本道综合一本久久久88| 国产成人麻豆精品| 2021天堂在线亚洲精品专区| 青青草原偷拍视频| 国产后式a一视频| 国内熟女少妇一线天| 综合五月天网| 欧美色视频日本| 亚洲欧美精品在线| 国产成人在线无码免费视频| 欧美午夜性视频| 无码精品国产VA在线观看DVD| 国外欧美一区另类中文字幕| 四虎成人在线视频| 亚洲精品自在线拍| 国产成人无码综合亚洲日韩不卡| 国产性爱网站| 久久久国产精品无码专区| 综合人妻久久一区二区精品| 中国一级特黄大片在线观看| 欧美日韩中文国产| 国产精品私拍在线爆乳| 成人福利视频网| 欧美啪啪网| 国产精品自在自线免费观看| 孕妇高潮太爽了在线观看免费| 国产打屁股免费区网站| 婷婷中文在线| 国产精品3p视频| 在线日本国产成人免费的| 欧美乱妇高清无乱码免费| 亚洲高清中文字幕在线看不卡| 国产成年无码AⅤ片在线| 亚洲色婷婷一区二区| 国产真实乱了在线播放| 国产免费久久精品99re丫丫一| 在线国产综合一区二区三区 | 亚洲一级毛片| 日韩精品一区二区三区免费在线观看| 国产第一页亚洲| 高清无码手机在线观看| 五月婷婷丁香色| 久久鸭综合久久国产| 国产福利大秀91| 久久www视频| 91系列在线观看| 日本不卡在线播放| 少妇精品在线| 日韩不卡高清视频|