国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

從settimeout看javascript的運(yùn)行機(jī)制

JerryC / 1251人閱讀

摘要:前言我們知道是一個(gè)單線程的語(yǔ)言,而且其運(yùn)行機(jī)制比較特殊。即異步任務(wù)一定在同步任務(wù)之后執(zhí)行。理解了閉包的同學(xué)一定可以理解這一點(diǎn)。

前言

我們知道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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/110225.html

相關(guān)文章

  • setTimeout-setIntervalJS線程

    摘要:提出標(biāo)準(zhǔn),允許腳本創(chuàng)建多個(gè)線程,但是子線程完全受主線程控制,且不得操作。所以,這個(gè)新標(biāo)準(zhǔn)并沒(méi)有改變單線程的本質(zhì)。事件循環(huán)主線程線程只會(huì)做一件事,就是從消息隊(duì)列里面取消息執(zhí)行消息,再取消息再執(zhí)行。工作線程是生產(chǎn)者,主線程是消費(fèi)者。 最近項(xiàng)目中遇到了一個(gè)場(chǎng)景,其實(shí)很常見(jiàn),就是定時(shí)獲取接口刷新數(shù)據(jù)。那么問(wèn)題來(lái)了,假設(shè)我設(shè)置的定時(shí)時(shí)間為1s,而數(shù)據(jù)接口返回大于1s,應(yīng)該用同步阻塞還是異步?我們...

    elliott_hu 評(píng)論0 收藏0
  • 深入淺出JavaScript運(yùn)行機(jī)制

    摘要:主線程從任務(wù)隊(duì)列中讀取事件,這個(gè)過(guò)程是循環(huán)不斷的,所以整個(gè)的這種運(yùn)行機(jī)制又稱(chēng)為事件循環(huán)。上面也提到,在到達(dá)指定時(shí)間時(shí),定時(shí)器就會(huì)將相應(yīng)回調(diào)函數(shù)插入任務(wù)隊(duì)列尾部。這就是定時(shí)器功能。關(guān)于定時(shí)器的重要補(bǔ)充定時(shí)器包括與兩個(gè)方法。 一、引子 本文介紹JavaScript運(yùn)行機(jī)制,這一部分比較抽象,我們先從一道面試題入手: console.log(1); setTimeout(function()...

    mochixuan 評(píng)論0 收藏0
  • 深入淺出JavaScript運(yùn)行機(jī)制

    摘要:主線程從任務(wù)隊(duì)列中讀取事件,這個(gè)過(guò)程是循環(huán)不斷的,所以整個(gè)的這種運(yùn)行機(jī)制又稱(chēng)為事件循環(huán)。上面也提到,在到達(dá)指定時(shí)間時(shí),定時(shí)器就會(huì)將相應(yīng)回調(diào)函數(shù)插入任務(wù)隊(duì)列尾部。這就是定時(shí)器功能。關(guān)于定時(shí)器的重要補(bǔ)充定時(shí)器包括與兩個(gè)方法。 一、引子 本文介紹JavaScript運(yùn)行機(jī)制,這一部分比較抽象,我們先從一道面試題入手: console.log(1); setTimeout(function()...

    魏明 評(píng)論0 收藏0
  • 深入淺出JavaScript運(yùn)行機(jī)制

    摘要:主線程從任務(wù)隊(duì)列中讀取事件,這個(gè)過(guò)程是循環(huán)不斷的,所以整個(gè)的這種運(yùn)行機(jī)制又稱(chēng)為事件循環(huán)。上面也提到,在到達(dá)指定時(shí)間時(shí),定時(shí)器就會(huì)將相應(yīng)回調(diào)函數(shù)插入任務(wù)隊(duì)列尾部。這就是定時(shí)器功能。關(guān)于定時(shí)器的重要補(bǔ)充定時(shí)器包括與兩個(gè)方法。 一、引子 本文介紹JavaScript運(yùn)行機(jī)制,這一部分比較抽象,我們先從一道面試題入手: console.log(1); setTimeout(function()...

    chaosx110 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<