国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

簡(jiǎn)單通過(guò)settimeout看javascript的運(yùn)行機(jī)制

2019-11-19 11:36:22
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

我們知道JS是一個(gè)單線程的語(yǔ)言,而且其運(yùn)行機(jī)制比較特殊。

下面我們通過(guò)settimeout的幾個(gè)示例來(lái)展現(xiàn)javascript的運(yùn)行機(jī)制的特殊點(diǎn)

示例1

console.log(1);setTimeout(function(){ console.log(2);},0);console.log(3);// 打印出 1 3 2

示例2

console.log('1');setTimeout(function(){ console.log('2');},0);while(1){}// 打印出1,然后瀏覽器卡死,不會(huì)打印出2

javascript會(huì)先把需要運(yùn)行的內(nèi)容放到任務(wù)隊(duì)列中

但是如果遇到settimeout,會(huì)認(rèn)為這是個(gè)異步任務(wù),會(huì)先放到異步隊(duì)列中

瀏覽器會(huì)先執(zhí)行同步任務(wù),等到同步任務(wù)執(zhí)行完之后,再查看異步隊(duì)列

如果異步隊(duì)列中的任務(wù)的執(zhí)行時(shí)機(jī)到了,瀏覽器就會(huì)把任務(wù)放到同步隊(duì)列中去。

即:

異步任務(wù)一定在同步任務(wù)之后執(zhí)行。

示例3

for(var i = 0; i < 4; i++){ setTimeout(function() {  console.log(i); }, 1000);}// 打印 4 4 4 4

為什么打印出的是4 4 4 4呢?

因?yàn)闉g覽器會(huì)先執(zhí)行for循環(huán)

每執(zhí)行一次for循環(huán),都把一個(gè)settimeout壓入異步隊(duì)列

1000毫秒之后,執(zhí)行settimeout里的方法的時(shí)候,i的值已經(jīng)是4了。

如果要打印0 1 2 3怎么辦呢?

利用閉包的特性,把i緩存到一個(gè)temp值里

for(var i = 0; i < 4; i++){ (function(temp){  setTimeout(function() {   console.log(temp);  }, 1000); })(i);}// 打印 0 1 2 3

這樣做等于是每一次for循環(huán)都新建了一個(gè)匿名函數(shù),i的值被存入了這個(gè)匿名函數(shù)的內(nèi)存里。

理解了閉包的同學(xué)一定可以理解這一點(diǎn)。

示例4

我們知道ES6引入了新的關(guān)鍵字let

在這里,let有一個(gè)新的特性

for(let i = 0; i < 4; i ++){ setTimeout(function(){  console.log(i);  }, 1000);}// 打印 0 1 2 3

示例4與示例3只有var和let這個(gè)地方有區(qū)別,但是打印出來(lái)的結(jié)果卻完全不同

這是因?yàn)閘et是一個(gè)塊級(jí)作用域

let定義的i,對(duì)于每一個(gè)for循環(huán)的執(zhí)行來(lái)說(shuō)都是一個(gè)全新的i(使用不同的內(nèi)存地址)

所以打印的時(shí)候可以得到0 1 2 3

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)武林網(wǎng)的支持。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 信丰县| 高唐县| 广德县| 红原县| 梁山县| 文成县| 封开县| 石景山区| 江都市| 新和县| 资源县| 太保市| 建湖县| 浠水县| 雷州市| 大埔县| 遂昌县| 涟水县| 杂多县| 济阳县| 禄劝| 济宁市| 西安市| 布拖县| 北辰区| 海宁市| 荣成市| 化州市| 罗定市| 霍邱县| 马龙县| 诏安县| 革吉县| 临江市| 久治县| 溆浦县| 哈尔滨市| 襄垣县| 武威市| 襄樊市| 昌江|