您好!欢迎访问95网站大全,本站是一个快速收录网站的网址导航/网站大全/网站导航网!
当前位置:95网站大全 » 投稿专栏 » 教育信息 » 文章详细 订阅RssFeed

回调函数(Callback)的常见用法

发布时间:2018-12-04 来源:网络转载 浏览:820次
回调函数(Callback)的常见用法图片

  【回调函数(Callback)的常见用法】究竟什么是回调函数(Callback),网上有许许多多的文章,大部分看得人云里雾外,这些文章大概分成两类,第一类堆砌了太多的术语,基本上不明白术语就没法看,另一类反过来,不讲术语,完全是举一些脱离编程的生活化例子来类比,看的人更加晕头转向。

  作为JS的核心,回调函数和异步执行是紧密相关的,不跨过这个门槛,很多回调代码能把人看晕!

  引用stack overflow 上大神的描述 其实callback 很简单也很纯粹:

  A "callback" is any function that is called by another function which takes the first function as a parameter. (在一个函数中调用另外一个函数就是callback)

  以下是一个最简单的例子:

  function a() {

  return 1

  }

  function b(aa) {

  return 2 + aa

  }

  //调用:

  var c=0

  c = b(a()) //A是个函数,但它又作为一个参数在B函数中被调用

  console.log(c) //结果显示3

  以上例子极易理解,下面再引入另一个概念:异步

  看以下代码:

  var a = 0

  function bb(x) {

  console.log(x)

  }

  function timer(time) {

  setTimeout(function () {

  a=6

  }, time);

  }

  //调用:

  console.log(a)

  timer(3000)

  bb(a)

  以上代码很简单,我们需要的逻辑是,全局变量a初值为0,然后过3秒后,让它为6,然后再打印出来,看上去,上面的代码没有问题,理论上符合我们的逻辑需求,但却发现结果是这样:

  0

  0

  咋回事?

  因为JS是一种异步执行语言,尽管timer函数内让a=6了,但是JS不会死等时间结束再跳出函数,而是马上就会执行下一步语句(即调用bb函数),但这时候3秒钟根本就没结束,a还没有被重新赋值,所以打印出来还是为0。

  用回调函数可以解决这个问题:

  var a = 0

  function bb(x) {

  console.log(x)

  }

  function timer(time, callback) {

  setTimeout(function () {

  a = 6

  callback(a);

  }, time);

  }

  //调用:

  console.log(a)

  timer(3000,bb)

  这次,在timer函数中添加了一个关键字callback,意思就是说此处不是一个普通的参数,而是一个函数名,打起精神,关键的地方来了:

  一般而言,函数的形参是指由外往内向函数体传递变量的入口,但此处加了callback后则完全相反,它是指函数体在完成某种使命后调用外部函数的出口!这时候应该明白什么叫"回调"了吧,也就是回头调用外部函数的意思。

  在本例中,当3秒钟到了后,首先a=6,然后通过关键字callback(a)调用了函数bb(x),结果显示:

  0

  6

  这个逻辑,符合我们的需求。

  在写法上,也可以不需要定义函数bb, 直接在调用timer的时候写成function形式,把调用部分改成这样也可以,效果完全一样:

  console.log(a)

  timer(3000, function (x) {

  console.log(x)

  })

  这种写法函数名都不需要了(术语称为"匿名函数"),在nodejs代码中更为常见也更好理解,翻译成自然语言就是:定时3秒,完成后再回头调用function(x)里面的内容。

  nodejs编程中大量使用了异步编程技术,这是为了高效使用硬件,同时也可以不造成同步阻塞。其实nodejs在底层还是通过多线程技术实现的异步操作,但普通用户并不需要深究它的实现方法,我们只要做好我们的异步处理即可。

┃ 推荐站点

  • 95网站大全95网站大全

    95网站大全/网站导航网汇聚国内外优秀的网站网址,并免费提供网站收录/网址导航/网站大全/网站导航/网站推广服务,快速帮助中小企业提升网站排名及知名度.

    2018-08-30
  • 网络新词网网络新词网

    疾风流行语网(www.jifengweb.com)实时更新网络热词与网络流行语,为您一站式解读最新最热门的网络新名词,网络新词,网络热词,引领热词榜单!包含最新网络流行语、网络流行语言、网络用语、网络流行用语、网络语言。

    2018-07-03
  • 网站提交入口网站提交入口

    最新搜索引擎提交入口,让网站一键提交搜索引擎.各大搜索引擎提交网站入口包含百度搜索/搜狗搜索(sogou搜索)/神马搜索/360搜索/谷歌搜索(google搜索)/搜搜(soso搜索),有道搜索/雅虎(yahoo搜索)/必应(bing搜索)等搜索引擎提交入口,欢迎提交.

    2018-07-03