成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS setTimeout時(shí)間

張遷 / 553人閱讀

摘要:所以根據(jù)不同的,在時(shí)間軸上定義匿名函數(shù)。當(dāng)然,由于匿名函數(shù)指向的是全局變量,此時(shí)主執(zhí)行結(jié)束早已為,所以彈出。

A

for (var i=5; i>=1; i--) { 
      setTimeout( function timer() {
          document.write(i+"
"); }, i*3000 ); } // 0 0 0 0 0 // 保存執(zhí)行后,3秒后彈出第一個(gè)console(0),之后隔3秒彈出第二個(gè),依次按照時(shí)間執(zhí)行。

B

 for (var i=5; i>=1; i--) { 
      setTimeout( function timer() {
          document.write(i+"
"); }, 3000 ); } // 0 0 0 0 0 // 保存執(zhí)行后,3秒后所有的console一齊彈出

C

 for (var i=5; i>0; i--) { 
          !function (i) {
              setTimeout( function timer() {
                console.log(i);
              }, i*3000 );
          }(i)
    }
   // 1 2 3 4 5 每隔3秒依次彈出
   
   
這里我抽象一下setTimeout的隊(duì)列執(zhí)行結(jié)構(gòu):

注意,時(shí)間設(shè)定與閉包沒有關(guān)系!

當(dāng)所有的非隊(duì)列結(jié)構(gòu)代碼都執(zhí)行完畢,函數(shù)調(diào)用棧清空后,這些setTimeout才會進(jìn)入隊(duì)列數(shù)據(jù)棧等待執(zhí)行
。而時(shí)間,就是按照圖中那樣:

A:

A與B的區(qū)別就是時(shí)間i*30003000的區(qū)別。

setTimeout定義是與正常的JS執(zhí)行是同步的,而函數(shù)的執(zhí)行是異步的,所以,根據(jù)不同的i值,setTiemout在時(shí)間軸上已經(jīng)定義了函數(shù)。
而且可以發(fā)現(xiàn),時(shí)間設(shè)置里的i是根據(jù)for循環(huán)變化的(5 4 3 2 1),這也反證了setTimeout的定義時(shí)是與主JS程序同步。所以根據(jù)不同的i*3000,在時(shí)間軸上定義匿名函數(shù)。執(zhí)行時(shí),每隔3秒,彈出一個(gè)0。
當(dāng)然,由于匿名函數(shù)指向的是全局變量i,此時(shí)主JS執(zhí)行結(jié)束早已為0,所以彈出0。

B:

在B代碼中,沒有設(shè)置i與時(shí)間的計(jì)算,所以循環(huán)中產(chǎn)生的5個(gè)匿名函數(shù)都是定義在3秒這個(gè)時(shí)間節(jié)點(diǎn)上,當(dāng)主JS代碼執(zhí)行完畢,開始執(zhí)行隊(duì)列結(jié)構(gòu)棧中的函數(shù)時(shí),5個(gè)函數(shù)在3秒后同時(shí)執(zhí)行,所以會彈出5個(gè)0。而對于匿名函數(shù)中的i取值,這里自然是來自全局變量中的i,主JS程序執(zhí)行完畢i自然運(yùn)算完畢值為0,所以5個(gè)i都是0;

C:

引入閉包的情況和B其實(shí)是類似的,時(shí)間設(shè)定與匿名函數(shù)執(zhí)行始終井水不犯河水,所以時(shí)間軸與B相同,不同的是匿名函數(shù)里的i值。
圖中嵌套的正方形就抽象為自調(diào)用函數(shù),每一次的循環(huán)中產(chǎn)生的i值,會傳入自調(diào)用函數(shù),保存在其變量對象中。由于匿名函數(shù)里的是自調(diào)用函數(shù)的閉包匿名函數(shù)引用了變量對象里的i,所以每個(gè)自調(diào)用函數(shù)的變量對象不會在執(zhí)行完畢后被回收,得以保持繼續(xù)被匿名函數(shù)引用著。最后實(shí)現(xiàn)最終效果。

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/87066.html

相關(guān)文章

  • 解析setTimeout時(shí)間設(shè)置為0

    摘要:要是當(dāng)前代碼耗時(shí)很長,有可能要等很久,所以并沒有辦法保證,回調(diào)函數(shù)一定會在指定的時(shí)間執(zhí)行。需要監(jiān)聽文字改變,每一次改變都會調(diào)用一次回調(diào)函數(shù),現(xiàn)在需要的一種實(shí)現(xiàn)是在用戶停止鍵盤事件一段時(shí)間后,去發(fā)送一個(gè)請求。 1、開胃菜,setTimeout為何物 首先看一下w3school上面對于setTimeout的解釋 setTimeout(fn,millisec) 方法用于在指定的毫秒數(shù)后調(diào)用函...

    zhigoo 評論0 收藏0
  • JS單線程與setTimeout執(zhí)行原理

    摘要:引擎單線程機(jī)制首先明確,引擎是單線程機(jī)制。是單線程執(zhí)行的,無法同時(shí)執(zhí)行多段代碼。解析是單線程的,所以會先執(zhí)行再,但這個(gè)循環(huán)體是死循環(huán),所以永遠(yuǎn)不會執(zhí)行。 Javascript 引擎單線程機(jī)制 首先明確,JavaScript引擎是單線程機(jī)制。 JavaScript 是單線程執(zhí)行的,無法同時(shí)執(zhí)行多段代碼。當(dāng)某一段代碼正在執(zhí)行的時(shí)候,所有后續(xù)的任務(wù)都必須等待,形成一個(gè)任務(wù)隊(duì)列。一旦當(dāng)前任務(wù)...

    tabalt 評論0 收藏0
  • JS代碼在nodejs環(huán)境下執(zhí)行機(jī)制和事件循環(huán)

    摘要:開始執(zhí)行文件,同步代碼執(zhí)行完畢后,進(jìn)入事件循環(huán)。時(shí)間未到的時(shí)候,如果有事件返回,就執(zhí)行該事件注冊的回調(diào)函數(shù)。對于多次執(zhí)行輸出結(jié)果不同,需要了解事件循環(huán)的基礎(chǔ)問題。 1. 說明 nodejs是單線程執(zhí)行的,同時(shí)它又是基于事件驅(qū)動的非阻塞IO編程模型。這就使得我們不用等待異步操作結(jié)果返回,就可以繼續(xù)往下執(zhí)行代碼。當(dāng)異步事件觸發(fā)之后,就會通知主線程,主線程執(zhí)行相應(yīng)事件的回調(diào)。 本篇文章講解n...

    Lowky 評論0 收藏0
  • javascript引擎執(zhí)行的過程的理解--執(zhí)行階段

    摘要:如果對語法分析和預(yù)編譯,還有疑問引擎執(zhí)行的過程的理解語法分析和預(yù)編譯階段。參與執(zhí)行過程的線程分別是引擎線程也稱為內(nèi)核,負(fù)責(zé)解析執(zhí)行腳本程序的主線程例如引擎。以上便是引擎執(zhí)行宏任務(wù)的整個(gè)過程。 一、概述 js引擎執(zhí)行過程主要分為三個(gè)階段,分別是語法分析,預(yù)編譯和執(zhí)行階段,上篇文章我們介紹了語法分析和預(yù)編譯階段,那么我們先做個(gè)簡單概括,如下: 1、語法分析: 分別對加載完成的代碼塊進(jìn)行語法...

    SnaiLiu 評論0 收藏0
  • javascript引擎執(zhí)行的過程的理解--執(zhí)行階段

    摘要:如果對語法分析和預(yù)編譯,還有疑問引擎執(zhí)行的過程的理解語法分析和預(yù)編譯階段。參與執(zhí)行過程的線程分別是引擎線程也稱為內(nèi)核,負(fù)責(zé)解析執(zhí)行腳本程序的主線程例如引擎。以上便是引擎執(zhí)行宏任務(wù)的整個(gè)過程。一、概述 js引擎執(zhí)行過程主要分為三個(gè)階段,分別是語法分析,預(yù)編譯和執(zhí)行階段,上篇文章我們介紹了語法分析和預(yù)編譯階段,那么我們先做個(gè)簡單概括,如下: 1、語法分析: 分別對加載完成的代碼塊進(jìn)行語法檢驗(yàn),語...

    Achilles 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<