美文网首页
回调函数callback

回调函数callback

作者: 你喜欢吃青椒吗_c744 | 来源:发表于2019-07-26 23:51 被阅读0次

    定义

    函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。(回拨电话)
    简单地说: 一个回调函数,就是在另外一个函数(通常是异步的)执行完之后再执行的函数,因而被命名为——回调。

    更进一步地说: 在JavaScript中,函数是对象。正因如此,一个函数可以被其他函数作为参数(传入),也能被其他函数作为返回值返回。这种函数(起码要满足如下条件之一:1.接受一个或多个函数作为参数,2.将一个函数作为返回值返回)被称为高阶函数。任何函数,只要它作为参数传入且随后被调用,都可称之为回调函数。

    一个例子理解回调函数

    你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。如果是同步事件,你就要在店里一直等到店里有货。

    回调与同步、异步并没有直接的联系,回调只是一种实现方式,既可以有同步回调,也可以有异步回调,还可以有事件处理回调和延迟函数回调

    什么地方会用到回调函数

    • 资源加载:动态加载js文件后执行回调,加载iframe后执行回调,ajax操作回调,图片加载完成执行回调,AJAX等等。
    • 事件:DOM事件及Node.js事件基于回调机制 (Node.js回调可能会出现多层回调嵌套的问题)。
    • 链式调用:链式调用的时候,在赋值器(setter)方法中(或者本身没有返回值的方法中)很容易实现链式调用,而取值器(getter)相对来说不好实现链式调用,因为你需要取值器返回你需要的数据而不是this指针,如果要实现链式方法,可以用回调函数来实现
    • setTimeout、setInterval的函数调用得到其返回值。由于两个函数都是异步的,即:他们的调用时序和程序的主流程是相对独立的,所以没有办法在主体里面等待它们的返回值,它们被打开的时候程序也不会停下来等待,否则也就失去了setTimeout及setInterval的意义了,所以用return已经没有意义,只能使用callback。

    执行时间

    回调函数,一般在同步情境下是最后执行的,而在异步情境下有可能不执行,因为事件没有被触发或者条件不满足。

    回调函数的使用

    function first(){
      setTimeout( function(){
        console.log(1);
      }, 1000 );
    }
    
    function second(){
      console.log(2);
    }
    
    first();
    second();
    
    结果输出 :
    2
    1
    

    一般来说,JavaScript会按照顺序自上而下执行代码。因为setTimeout是一个异步的过程。所以会先执行下面的函数,最后执行上面的函数。即使setTimeout设置为0也一样,会最后执行。

    参考文章

    关于 js 中的回调函数 callback
    彻底理解JavaScript中回调函数 (推荐)
    回归基础:在JavaScript中回调函数是什么? — SitePoint

    相关文章

      网友评论

          本文标题:回调函数callback

          本文链接:https://www.haomeiwen.com/subject/bnpjrctx.html