久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      徹底理解 Node.js 中的回調(diào)(Callback)函數(shù)

      究竟什么是回調(diào)函數(shù)(Callback),網(wǎng)上有許許多多的文章,大部分看得人云里霧外,這些文章大概分成兩類,第一類堆砌了太多的術(shù)語(yǔ),基本上不明白術(shù)語(yǔ)就沒(méi)法看,另一類反過(guò)來(lái),不講術(shù)語(yǔ),完全是舉一些脫離編程的生活化例子來(lái)類比,看的人更加暈頭轉(zhuǎn)向。

      作為JS的核心,回調(diào)函數(shù)和異步執(zhí)行是緊密相關(guān)的,不跨過(guò)這個(gè)門檻,很多回調(diào)代碼能把人看暈!

      引用stack overflow 上大神的描述 其實(shí)callback 很簡(jiǎn)單也很純粹:

      A “callback” is any function that is called by another function which takes the first function as a parameter. (在一個(gè)函數(shù)中調(diào)用另外一個(gè)函數(shù)就是callback)

      以下是一個(gè)最簡(jiǎn)單的例子:

      function a() {      return 1  }     function b(aa) {      return 2 + aa  }     //調(diào)用:  var c=0  c = b(a()) //A是個(gè)函數(shù),但它又作為一個(gè)參數(shù)在B函數(shù)中被調(diào)用  console.log(c) //結(jié)果顯示3

      以上例子極易理解,下面再引入另一個(gè)概念:異步

      看以下代碼:

      var a = 0     function bb(x) {      console.log(x)  }     function timer(time) {      setTimeout(function () {          a=6      }, time);  }     //調(diào)用:  console.log(a)  timer(3000)  bb(a)

      以上代碼很簡(jiǎn)單,我們需要的邏輯是,全局變量a初值為0,然后過(guò)3秒后,讓它為6,然后再打印出來(lái),看上去,上面的代碼沒(méi)有問(wèn)題,理論上符合我們的邏輯需求,但卻發(fā)現(xiàn)結(jié)果是這樣:

      0  0

      咋回事?

      因?yàn)镴S是一種異步執(zhí)行語(yǔ)言,盡管timer函數(shù)內(nèi)讓a=6了,但是JS不會(huì)死等時(shí)間結(jié)束再跳出函數(shù),而是馬上就會(huì)執(zhí)行下一步語(yǔ)句(即調(diào)用bb函數(shù)),但這時(shí)候3秒鐘根本就沒(méi)結(jié)束,a還沒(méi)有被重新賦值,所以打印出來(lái)還是為0。

      用回調(diào)函數(shù)可以解決這個(gè)問(wèn)題:

      var a = 0     function bb(x) {      console.log(x)  }     function timer(time, callback) {      setTimeout(function () {          a = 6          callback(a);      }, time);  }     //調(diào)用:  console.log(a)  timer(3000,bb)

      這次,在timer函數(shù)中添加了一個(gè)關(guān)鍵字callback,意思就是說(shuō)此處不是一個(gè)普通的參數(shù),而是一個(gè)函數(shù)名,打起精神,關(guān)鍵的地方來(lái)了:

      一般而言,函數(shù)的形參是指由外往內(nèi)向函數(shù)體傳遞變量的入口,但此處加了callback后則完全相反,它是指函數(shù)體在完成某種使命后調(diào)用外部函數(shù)的出口!這時(shí)候應(yīng)該明白什么叫”回調(diào)”了吧,也就是回頭調(diào)用外部函數(shù)的意思。

      在本例中,當(dāng)3秒鐘到了后,首先a=6,然后通過(guò)關(guān)鍵字callback(a)調(diào)用了函數(shù)bb(x),結(jié)果顯示:

      0  6

      這個(gè)邏輯,符合我們的需求。

      在寫法上,也可以不需要定義函數(shù)bb, 直接在調(diào)用timer的時(shí)候?qū)懗蒮unction形式,把調(diào)用部分改成這樣也可以,效果完全一樣:

      console.log(a)  timer(3000, function (x) {      console.log(x)  })

      這種寫法函數(shù)名都不需要了(術(shù)語(yǔ)稱為”匿名函數(shù)”),在nodejs代碼中更為常見(jiàn)也更好理解,翻譯成自然語(yǔ)言就是:定時(shí)3秒,完成后再回頭調(diào)用function(x)里面的內(nèi)容。

      nodejs編程中大量使用了異步編程技術(shù),這是為了高效使用硬件,同時(shí)也可以不造成同步阻塞。其實(shí)nodejs在底層還是通過(guò)多線程技術(shù)實(shí)現(xiàn)的異步操作,但普通用戶并不需要深究它的實(shí)現(xiàn)方法,我們只要做好我們的異步處理即可。

      作者:rockage

      原文:https://blog.csdn.net/rockage/article/details/79513450

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)