最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用幾道面試題來(lái)看JavaScript執(zhí)行機(jī)制

 更新時(shí)間:2021年04月30日 14:33:25   作者:淺笑·  
這篇文章主要介紹了JavaScript的執(zhí)行機(jī)制,對(duì)此感興趣的同學(xué),可以參考下

前面的話

根據(jù)JavaScript的運(yùn)行環(huán)境,鎖定它為單線程,任務(wù)需要排隊(duì)執(zhí)行,如果網(wǎng)站資源比較大,這樣會(huì)導(dǎo)致瀏覽器加載會(huì)很慢,但實(shí)際上并沒(méi)有,大家肯定立刻想到了同步和異步。

所謂的同步和異步也是在排隊(duì),只是排隊(duì)的地方不同。

同步和異步

同步任務(wù)進(jìn)入主線程排隊(duì),異步任務(wù)進(jìn)入事件隊(duì)列中排隊(duì)

同步任務(wù)和異步任務(wù)進(jìn)入到不同的隊(duì)列中,也就是上面講的在不同地方排隊(duì)。

同步任務(wù)進(jìn)入主線程,異步任務(wù)進(jìn)入事件隊(duì)列,主線程任務(wù)執(zhí)行完畢,事件隊(duì)列中有等待執(zhí)行的任務(wù)進(jìn)入主線程執(zhí)行,直到事件隊(duì)列中任務(wù)全部執(zhí)行完畢。

開(kāi)胃菜

console.log('a')

setTimeout(function(){
    console.log('b')
}, 200)

setTimeout(function(){
    console.log('c')
}, 0)

console.log('d')

a d c b

從上到下,該進(jìn)入主線程的進(jìn)入主線程,該進(jìn)入事件隊(duì)列的進(jìn)入事件隊(duì)列。

那么主線程中存在console.log('a')和console.log('d'),定時(shí)器setTimeout延遲一段時(shí)間執(zhí)行,顧名思義異步任務(wù)進(jìn)入事件隊(duì)列中,等待主線程任務(wù)執(zhí)行完畢,再進(jìn)入主線程執(zhí)行。

定時(shí)器的延遲時(shí)間為0并不是立刻執(zhí)行,只是代表相比于其他定時(shí)器更早的進(jìn)入主線程中執(zhí)行。

加一盤(pán)

for(var i = 0; i < 10; i++) {
    setTimeout(function() {
        console.log(i)
    }, 1000)
}

結(jié)果:十個(gè)10

每次for循環(huán)遇到setTimeout將其放入事件隊(duì)列中等待執(zhí)行,直到全部循環(huán)結(jié)束,i作為全局變量當(dāng)循環(huán)結(jié)束后i = 10,再來(lái)執(zhí)行setTimeout時(shí)i的值已經(jīng)為10, 結(jié)果為十個(gè)10。

將var改為let,變量作用域不同,let作用在當(dāng)前循環(huán)中,所以進(jìn)入事件隊(duì)列的定時(shí)器每次的i不同,最后打印結(jié)果會(huì)是 0 1 2...9。

宏任務(wù) 微任務(wù)

除了經(jīng)常說(shuō)的同步任務(wù)和異步任務(wù)之外,更可分為宏任務(wù),微任務(wù)

主要宏任務(wù):整段腳本scriptsetTimeoutsetTimeout...

主要微任務(wù):promise.then...

執(zhí)行流程:

1.整段腳本script作為宏任務(wù)開(kāi)始執(zhí)行

2.遇到微任務(wù)將其推入微任務(wù)隊(duì)列,宏任務(wù)推入宏任務(wù)隊(duì)列

3.宏任務(wù)執(zhí)行完畢,檢查有沒(méi)有可執(zhí)行的微任務(wù)

4.發(fā)現(xiàn)有可執(zhí)行的微任務(wù),將所有微任務(wù)執(zhí)行完畢

5.開(kāi)始新的宏任務(wù),反復(fù)如此直到所有任務(wù)執(zhí)行完畢

來(lái)一盤(pán)Promise

const p = new Promise(resolve => {
    console.log('a')
    resolve()
    console.log('b')
})

p.then(() => {
    console.log('c')
})

console.log('d')

結(jié)果:a b d c

1.整段script進(jìn)入宏任務(wù)隊(duì)列開(kāi)始執(zhí)行

2.promise創(chuàng)建立即執(zhí)行,打印ab

3.遇到promise.then進(jìn)入微任務(wù)隊(duì)列

4.遇到console.log('d')打印d

5.整段代碼作為宏任務(wù)執(zhí)行完畢,有可執(zhí)行的微任務(wù),開(kāi)始執(zhí)行微任務(wù),打印c。

setTimeout(function(){
    console.log('setTimeout')
}, 0)

const p = new Promise(resolve => {
    console.log('a')
    resolve()
    console.log('b')
})

p.then(() => {
    console.log('c')
})

console.log('d')

結(jié)果:a b d c setTimeout

1.setTimeout進(jìn)入宏任務(wù)隊(duì)列

2.promise創(chuàng)建立即執(zhí)行,打印ab

3.遇到promise.then進(jìn)入微任務(wù)隊(duì)列

4.遇到console.log('d')打印d

5.有可執(zhí)行的微任務(wù),打印c

6.微任務(wù)執(zhí)行完畢,開(kāi)始執(zhí)行新的宏任務(wù),setTimeout開(kāi)始執(zhí)行,打印setTimeout

setTimeout(function(){
    console.log('setTimeout')
}, 0)

const p = new Promise(resolve => {
    console.log('a')
    resolve()
    console.log('b')
})

p.then(() => {
    console.log('c')
    setTimeout(function(){
        console.log('then中的setTimeout')
    }, 0)
})

console.log('d')

結(jié)果:a b d c setTimeout then中的setTimeout

1.同上

2.執(zhí)行微任務(wù)打印c,遇到setTimeout將其推入宏任務(wù)隊(duì)列中

3.定時(shí)器延遲時(shí)間相同,開(kāi)始按照順序執(zhí)行宏任務(wù),分別打印setTimeoutthen中的setTimeout

再加點(diǎn)定時(shí)器

console.log('a');

new Promise(resolve => {
    console.log('b')
    resolve()
}).then(() => {
    console.log('c')
    setTimeout(() => {
      console.log('d')
    }, 0)
})

setTimeout(() => {
    console.log('e')
    new Promise(resolve => {
        console.log('f')
        resolve()
    }).then(() => {
        console.log('g')
    })
}, 100)

setTimeout(() => {
    console.log('h')
    new Promise(resolve => {
        resolve()
    }).then(() => {
        console.log('i')
    })
    console.log('j')
}, 0)

結(jié)果:a b c h j i d e f g

1.打印a

2.promise立即執(zhí)行,打印b

3.promise.then推入微任務(wù)隊(duì)列

4.setTimeout推入宏任務(wù)隊(duì)列

5.整段代碼執(zhí)行完畢,開(kāi)始執(zhí)行微任務(wù),打印c,遇到setTimeout推入宏任務(wù)隊(duì)列排隊(duì)等待執(zhí)行

6.沒(méi)有可執(zhí)行的微任務(wù)開(kāi)始執(zhí)行宏任務(wù),定時(shí)器按照延遲時(shí)間排隊(duì)執(zhí)行

7.打印h j,promise.then推入微任務(wù)隊(duì)列有

8.可執(zhí)行的微任務(wù),打印i,繼續(xù)執(zhí)行宏任務(wù),打印d

9.執(zhí)行延遲為100的宏任務(wù),打印e f,執(zhí)行微任務(wù)打印g,所有任務(wù)執(zhí)行完畢

簡(jiǎn)單測(cè)試

console.log('start')

a().then(() => {
  console.log('a_then')
})

console.log('end')

function a() {
  console.log('a_function')
  return b().then((res) => {
    console.log('res', res)
    console.log('b_then')
    return Promise.resolve('a方法的返回值')
  })
}

function b() {
  console.log('b_function')
  return Promise.resolve('返回值')
}

結(jié)果:start a_function b_function end res 返回值 b_then a_then

根據(jù)上面例子的流程講解來(lái)思考這個(gè),加深理解

總結(jié)

  • JavaScript單線程,任務(wù)需要排隊(duì)執(zhí)行
  • 同步任務(wù)進(jìn)入主線程排隊(duì),異步任務(wù)進(jìn)入事件隊(duì)列排隊(duì)等待被推入主線程執(zhí)
  • 行定時(shí)器的延遲時(shí)間為0并不是立刻執(zhí)行,只是代表相比于其他定時(shí)器更早的被執(zhí)行
  • 以宏任務(wù)和微任務(wù)進(jìn)一步理解js執(zhí)行機(jī)制
  • 整段代碼作為宏任務(wù)開(kāi)始執(zhí)行,執(zhí)行過(guò)程中宏任務(wù)和微任務(wù)進(jìn)入相應(yīng)的隊(duì)列中
  • 整段代碼執(zhí)行結(jié)束,看微任務(wù)隊(duì)列中是否有任務(wù)等待執(zhí)行,如果有則執(zhí)行所有的微任務(wù),直到微任務(wù)隊(duì)列中的任務(wù)執(zhí)行完畢,如果沒(méi)有則繼續(xù)
  • 執(zhí)行新的宏任務(wù)執(zhí)行新的宏任務(wù),凡是在執(zhí)行宏任務(wù)過(guò)程中遇到微任務(wù)都將其推入微任務(wù)隊(duì)列中執(zhí)行
  • 反復(fù)如此直到所有任務(wù)全部執(zhí)行完畢

以上就是用幾道面試題來(lái)看JavaScript執(zhí)行機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于JavaScript執(zhí)行機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • js獲取異步函數(shù)數(shù)據(jù)的實(shí)現(xiàn)

    js獲取異步函數(shù)數(shù)據(jù)的實(shí)現(xiàn)

    本文主要介紹了js獲取異步函數(shù)數(shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • JS實(shí)現(xiàn)直接運(yùn)行html代碼的方法

    JS實(shí)現(xiàn)直接運(yùn)行html代碼的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)直接運(yùn)行html代碼的方法,涉及javascript窗口操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-03-03
  • javascript模擬鼠標(biāo)點(diǎn)擊事件原理和實(shí)現(xiàn)方法

    javascript模擬鼠標(biāo)點(diǎn)擊事件原理和實(shí)現(xiàn)方法

    本文詳細(xì)介紹了JS模擬鼠標(biāo)點(diǎn)擊事件的原理以及應(yīng)用場(chǎng)景,并提供了模擬鼠標(biāo)左鍵點(diǎn)擊事件、右鍵點(diǎn)擊事件、滾輪事件和移動(dòng)事件的代碼實(shí)現(xiàn),了解JS模擬鼠標(biāo)點(diǎn)擊事件的原理和實(shí)現(xiàn)方法對(duì)于開(kāi)發(fā)人員非常重要,這對(duì)于許多面向用戶的web應(yīng)用程序的開(kāi)發(fā)和測(cè)試都具有很重要的意義
    2023-09-09
  • JS如何獲取地址欄的參數(shù)實(shí)例講解

    JS如何獲取地址欄的參數(shù)實(shí)例講解

    本篇文章給大家?guī)?lái)了關(guān)于JS如何獲取地址欄的參數(shù)實(shí)例講解,有需要的朋友們參考下。
    2018-10-10
  • 微信小程序?qū)崿F(xiàn)隨機(jī)驗(yàn)證碼功能

    微信小程序?qū)崿F(xiàn)隨機(jī)驗(yàn)證碼功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)隨機(jī)驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • bootstrap daterangepicker漢化以及擴(kuò)展功能

    bootstrap daterangepicker漢化以及擴(kuò)展功能

    這篇文章主要為大家詳細(xì) 介紹了bootstrap daterangepicker漢化以及擴(kuò)展功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • JS常見(jiàn)創(chuàng)建類(lèi)的方法小結(jié)【工廠方式,構(gòu)造器方式,原型方式,聯(lián)合方式等】

    JS常見(jiàn)創(chuàng)建類(lèi)的方法小結(jié)【工廠方式,構(gòu)造器方式,原型方式,聯(lián)合方式等】

    這篇文章主要介紹了JS常見(jiàn)創(chuàng)建類(lèi)的方法,結(jié)合實(shí)例形式總結(jié)分析了工廠方式,構(gòu)造器方式,原型方式,聯(lián)合方式等常見(jiàn)的javascript創(chuàng)建類(lèi)的常用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-04-04
  • JavaScript頭像上傳插件源碼分享

    JavaScript頭像上傳插件源碼分享

    這篇文章主要為大家分享介紹了JavaScript頭像上傳插件源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • d3繪制基本的柱形圖的實(shí)現(xiàn)代碼

    d3繪制基本的柱形圖的實(shí)現(xiàn)代碼

    柱形圖是圖表中常見(jiàn)的一種,這篇文章主要介紹了d3繪制基本的柱形圖的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Javascript控制div屬性動(dòng)態(tài)變化實(shí)例分析

    Javascript控制div屬性動(dòng)態(tài)變化實(shí)例分析

    這篇文章主要介紹了Javascript控制div屬性動(dòng)態(tài)變化,以實(shí)例形式較為詳細(xì)的分析了JavaScript響應(yīng)鼠標(biāo)事件動(dòng)態(tài)操作頁(yè)面元素屬性的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10

最新評(píng)論

吉安县| 通渭县| 赤水市| 常州市| 苍溪县| 洛隆县| 广汉市| 中方县| 拉孜县| 彰化县| 鸡东县| 临夏市| 贞丰县| 金溪县| 天祝| 迁安市| 平阳县| 本溪市| 宜川县| 皋兰县| 荣成市| 宜春市| 东乌| 湘西| 达孜县| 洛宁县| 新建县| 习水县| 灵璧县| 贡嘎县| 武清区| 永春县| 墨竹工卡县| 巫山县| 高邑县| 蒲城县| 普洱| 渭南市| 左权县| 休宁县| 彭山县|