精华内容
下载资源
问答
  • JavaScript-回调函数

    千次阅读 2017-07-19 12:49:55
    回调函数特点 不会立刻执行 是个闭包 执行前类型判断 this的使用 允许传递多个回调函数 回调函数嵌套 回调函数的优点和使用场景 优点 使用场景 实战回调函数的定义In computer programming, a callback is a piece...

    回调函数的定义

    In computer programming, a callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time

    回调函数是一段可执行的代码段,它作为一个参数传递给其他的代码,其作用是在需要的时候方便调用这段(回调函数)代码。

    在JavaScript中函数也是对象的一种,同样对象可以作为参数传递给函数,因此函数也可以作为参数传递给另外一个函数,这个作为参数的函数就是回调函数。


    语法

    回调函数

    function add(num1, num2, callback){
        var sum = num1 + num2;
        callback(sum);
    }
    
    function print(num){
        console.log(num);
    }
    
    add(1, 2, print);       //=>3

    举例:

    <!DOCTYPE html>
    <html>
    <body>
    <title>回调函数</title>
    <script language="javascript" type="text/javascript">
    
      function add(num1 ,num2 ,callback){
        var sum = num1 + num2;
        callback(sum);
      }
    
    
      function doSummary(sum){
        alert(sum);
      }
    
    
      add(3,5,doSummary);
    </script>
    </body>
    </html>
    

    这里写图片描述


    匿名回调函数

    function add(num1, num2, callback){
        var sum = num1 + num2;
        callback(sum);
    }
    
    add(1, 2, function(sum){
        console.log(sum);       //=>3
    });

    举例:

    <!DOCTYPE html>
    <html>
    <body>
    <title>匿名回调函数</title>
    <script language="javascript" type="text/javascript">
    
      function add(num1 ,num2 ,callback){
        var sum = num1 + num2;
        callback(sum);
      }
    
    
      add(3,5,function(sum){
            alert(sum);
        });
    </script>
    </body>
    </html>
    

    我们经常使用的jQuery中大量的使用了回调函数

    $("#btn").click(function() {
      alert("button clicked");
    });

    这里写图片描述


    回调函数的特点

    不会立刻执行

    回调函数作为参数传递给一个函数的时候,传递的只是函数的定义并不会立即执行。和普通的函数一样,回调函数在函调用函数中也要通过()运算符调用才会执行。


    是个闭包

    回调函数是一个闭包,也就是说它能访问到其外层定义的变量。

    执行前类型判断

    在执行回调函数前最好确认其是一个函数。

    function add(num1, num2, callback){
        var sum = num1 + num2;
        if(typeof callback === 'function'){
            callback(sum);
        }
    }

    this的使用

    注意在回调函数调用时this的执行上下文并不是回调函数定义时的那个上下文,而是调用它的函数所在的上下文.

    ar obj = {
        sum: 0,
        add: function(num1, num2){
            this.sum = num1 + num2;
        }
    };
    
    function add(num1, num2, callback){
        callback(num1, num2);
    };
    
    add(1,2, obj.add);
    console.log(obj.sum);           //=>0
    console.log(window.sum);        //=>3

    上述代码调用回调函数的时候是在全局环境下,因此this指向的是window,所以sum的值是赋值给windows的。

    关于this执行上下文的问题可以通过apply方法解决。

    var obj = {
        sum: 0,
        add: function(num1, num2){
            this.sum = num1 + num2;
        }
    };
    
    function add(num1, num2, callbackObj, callback){
        callback.apply(callbackObj, [ num1, num2 ]);
    };
    
    add(1,2, obj, obj.add);
    console.log(obj.sum);           //=>3
    console.log(window.sum);        //=>undefined

    允许传递多个回调函数

    一个函数中可以传递多个回调函数,典型的例子如jQuery

    function successCallback() {
        // Do stuff before send​
    }
    ​function successCallback() {
        // Do stuff if success message received​
    }​
    ​function completeCallback() {
        // Do stuff upon completion​
    }
    ​function errorCallback() {
        // Do stuff if error received​
    }
    $.ajax({
        url: "http://fiddle.jshell.net/favicon.png",
        success: successCallback,
        complete: completeCallback,
        error: errorCallback
    });

    回调函数嵌套

    一个回调函数中可以嵌入另一个回调函数,对于这种情况出现多层嵌套时,代码会难以阅读和维护,这个时候可以采用命名回调函数的方式调用,或者采用模块化管理函数,也可以用promise模式编程。


    回调函数的优点和使用场景

    优点

    • DRY,避免重复代码。
    • 可以将通用的逻辑抽象。
    • 加强代码可维护性。
    • 加强代码可读性。
    • 分离专职的函数。

    使用场景

    • 异步编程。
    • 事件监听、处理。
    • setTimeout、setInterval方法。
    • 通用功能,简化逻辑。


    实战

    CommonAction.qryTableDate是异步调用的,所以在外层无法获取函数里面的值,不能直接返回,采用回调的方式 :给documentTypeMapping这个函数设置一个回调函数,在CommonAction的回调里面调用传过来的这个回调函数。

    //documentType switch  id to name 
    // 两个入参 docmentTypeId 和 回调函数
    documentTypeMapping: function (documentType,returnDocumentTypeNameCallback){
    
     var documentMappingName ;
      // load from db
      var certTypeParam = {
            tableName: 'CERT_TYPE',
            columnArray: ["CERT_TYPE_ID", "CERT_TYPE_NAME", "CERT_TYPE_CODE", "CUST_TYPE"]};
    
    // 异步的方法,无法在外层直接获取到documentMappingName,通过回调获取       
    CommonAction.qryTableDate(certTypeParam, 'POST', function (result) {
                    fish.forEach(result, function (val) {
                        if (val.dataValueArray[3] == '' || val.dataValueArray[3] == 'A') {
                            if(val.dataValueArray[0] == documentType){
                                documentMappingName = val.dataValueArray[1];
                                console.log("Name:" + documentMappingName);
    
     // 回调函数                         returnDocumentTypeNameCallback(documentMappingName);
                            }
                        }
                    });
                 })
            }

    这里写图片描述

    调用

    // 第二个参数为回调函数,获取 documentMappingName,设置在组件上
    that.documentTypeMapping(result.documentType,function(documentMappingName) {
                        that.$('input[name="documentType"]').combobox('text', documentMappingName);
                    })

    这里写图片描述

    展开全文
  • 1. 回调函数: 函数指针的调用,即是一个通过函数指针调用的函数; 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。 In computer programming, ...

    1. 什么是回调函数:

    函数指针的调用,即是一个通过函数指针调用的函数;

    如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。

    In computer programming, a callback is any executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at a given time. This execution may be immediate as in a synchronous callback, or it might happen at a later time as in an asynchronous callback.

    即:把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,就叫做回调。如果代码立即被执行就称为同步回调,如果在之后晚点的某个时间再执行,则称为异步回调。

    比如:我们去“新白鹿”餐馆点餐,好多人排队正在等餐,你吃完了我才能进去吃,我就在哪儿一直等着......我也不急么;后来你过来要吃饭,我先给你一个电子牌替你排好队,我先做给其他顾客吃,你去干你自己的事(逛附件商场),等好了,我叫你(并把你要的饭菜给你),这就是回调。

    2. 为什么要使用回调函数

    回到函数作用:“解耦”,普通函数代替不了回调函数的这个特点。这是回调函数最大的特点。

                                          

     

    #include<stdio.h>
    #include<freeLib.h> 
    
    // Callback Function
    int Callback()
    {
        // TODO
        func();
        return 0;
    }
    
    // Main program
    int main()
    {
        // TODO
        Library(Callback);
    
        return 0;
    }

    使用回调函数,和普通函数调用区别:1)在主入口程序中,把回调函数像参数一样传入库函数。这样一来,只要我们改变传进库函数的参数,就可以实现不同的功能,且不需要修改库函数的实现,变的很灵活,这就是解耦

    2)主函数和回调函数是在同一层的,而库函数在另外一层。如果库函数对我们不可见,我们修改不了库函数的实现,也就是说不能通过修改库函数让库函数调用普通函数那样实现,那我们就只能通过传入不同的回调函数了,这也就是在日常工作中常见的情况。

    回调函数其实就是函数指针的一种用法:A "callback" is any function that is called by another function which takes the first function as a parameter。

    注:使用回调函数会有间接调用,因此,会有一些额外的传参与访存开销,对于MCU代码中对时间要求较高的代码要慎用。

    3. 回调函数:使用其实也是不得已而为之,是一种解决问题的策略

    回调函数的使用是对函数指针的应用,函数指针的概念本身很简单,但是把函数指针应用于回调函数就体现了一种解决问题的策略,一种设计系统的思想。

    回调函数的缺点:
    1)回调函数固然能解决一部分系统架构问题但是绝不能再系统内到处都是,如果你发现你的系统内到处都是回调函数,那么你一定要重构你的系统。

    2)回调函数本身是一种破坏系统结构的设计思路,回调函数会绝对的变化系统的运行轨迹,执行顺序,调用顺序。回调函数的出现会让读到你的代码的人非常的懵头转向。

    回调函数是一种不得以而为之的设计策略比如:
    在一个下载系统中有一个文件下载模块和一个下载文件当前进度显示模块,系统要求实时的显示文件的下载进度,想想很简单在面向对象的世界里无非是实现两个类而已。但是问题恰恰出在这里,显示模块如何驱动下载进度条?显示模块不知道也不应该知道下载模块所知道的文件下载进度(面向对象设计的封装性,模块间要解耦,模块内要内聚),文件下载进度是只有下载模块才知道的事情,解决方案很简单给下载模块传递一个函数指针作为回调函数驱动显示模块的显示进度。

    在面向对象的世界中这样的例子还真不少,造成这样的问题的根源,是面向对象的程序设计思想,设计模式中要求的模块独立性,高内聚低耦合等特性。

    我们需要模块间的协作,同时我们又厌恶的摒弃模块间你中有我我中有你的暧昧关系那如何生成系统呢?是函数指针(不一定一定是函数指针)也就是使用回调的方式。如果一个对象关心另一个对象的状态变化那么给状态的变化注册回调函数让它通知你这类状态的改变,这样在封装了模块变化的同时实现了模块间的协作关系另辟独径的给对象解耦。

     

     

    参考:https://blog.csdn.net/u013383344/article/details/54629658?utm_source=blogxgwz9

    https://www.runoob.com/w3cnote/c-callback-function.html

    https://www.jianshu.com/p/75f261df59e6

    展开全文
  • C语言中的回调函数

    2020-12-22 15:21:25
    回调函数是C语言的一种常用的高级应用,在库函数和应用程序中都有广泛的应用。  要点:  1.回调函数的调用方式  2.回调函数的完全形式的参数传递原则  3.C语言库函数的回调函数使用  回调函数的概念和作用...
  • 回调函数详解

    千次阅读 2018-12-04 19:26:53
    一、什么是回调函数   回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。函数是你...

    一、什么是回调函数

      回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。函数是你实现的,但由别人(或系统)的函数在运行时通过参数传递的方式调用,这就是所谓的回调函数。简单来说,当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数

    二、回调函数详解

    1、C语言中的回调函数

      回调函数主要结构有三部分组成:主函数、调用函数和被调函数。C语言中,被调函数通常以函数指针(指向对应函数的入口地址)的形式出现。

    //定义回调函数
    void PrintfText() 
    {
        printf("Hello World!\n");
    }
    
    //定义实现回调函数的"调用函数"
    // 参数为函数指针,无参数返回void
    void CallPrintfText(void (*callfuct)())
    {
        callfuct();
    }
    
    //实现函数回调
    int main(int argc,char* argv[])
    {
        CallPrintfText(PrintfText);
        return 0;
    }
    

      调用函数向其函数中传递void (*callfuct)(void)这是一个void callfuct(void)函数的入口地址,即PC指针可以通过移动到该地址执行void callfuct(void)函数。
      实现函数调用中,函数调用了“调用函数”,再在其中进一步调用被“调用函数”。相比于主函数直接调用“被调函数”,这种方法为使用者,而不是开发者提供了灵活的接口。另外,函数入口可以像变量一样设定同样为开发者提供了灵活性。

    2、C++中的回调函数

    bool myIsShorter(const string &s1, const string &s2)
    {    
         return s1.size() < s2.size();
    }
    // 前面两个是普通参数,即迭代器,第三个参数isShorter就是回调函数
    // 在传递myIsShorter这个参数时,只需写函数名,它代表函数指针
    stable_sort(words.begin(), words.end(), myIsShorter);
    

      stable_sort调用了myIsShorter,而myIsShorter又调用了stable_sort给它的单词,它们相互调用。这就是“回调”这两个字的含义。

    3、回调函数的机制

    (1) 定义一个回调函数;

    (2)提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;

    (3)当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

    三、为什么要用回调函数

      因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。

      如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、归并排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。

      回调可用于通知机制,例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。实际上,SetTimer()API使用了一个回调函数来通知计时器,而且,万一没有提供回调函数,它还会把一个消息发往程序的消息队列。

    四、回调函数的优点

    • 可以让实现方,根据回调方的多种形态进行不同的处理和操作。

    • 可以让实现方,根据自己的需要定制回调方的不同形态。

    • 可以将耗时的操作隐藏在回调方,不影响实现方其它信息的展示。

    • 让代码的逻辑更加集中,更加易读。

    五、回调函数总结

      总之,所谓回调函数就是把函数当作参数使用目的是使程序更加普适(正如活字印刷,把可能会“变”的字一个个分离开来,这样就可以任意组合,重复利用)。一般情况下,一个人的小规模程序用不着这种普适性,除非你想把它做成工具箱(比如游戏引擎),供他人使用。

    展开全文
  • 回调函数callback

    2014-01-08 17:29:36
    回调函数 [定义] 回调函数就是一个通过函数指针调用的函数。如果函数A的指针(地址)作为参数传递给函数C,当函数A的指针被用于调用函数A时,我们就说函数A是一个回调函数回调函数不是由该函数的实现方称为函数...

    回调函数

    [定义]

    回调函数就是一个通过函数指针调用的函数。如果函数A的指针(地址)作为参数传递给函数C,当函数A的指针被用于调用函数A时,我们就说函数A是一个回调函数。回调函数不是由该函数的实现方称为函数A直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。




    [特点]
    1 使用回调函数可以将调用者和被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。
    2 回调函数本质上是为了解决异步操作


    [应用]
    1 当某个鼠标事件发生的时候自动调用
    2 创建一个线程,线程开始运行时,执行注册的函数操作
    3 QT类似的槽信号(slot-signal)机制,当某个信号signal发生时,调用相应的槽函数slot
    4 用于通知机制,与信号槽类似

    函数A中设置一个计时器,每到一定时间,该函数会得到相应的通知,但通知机制的实现者对程序一无所知。那么,就需一个具有特定原型的函数指针进行回调,通知函数A事件已经发生。实际上,API使用一个回调函数SetTimer()来通知计时器。如果没有提供回调函数,它还会把一个消息发往程序的消息队列。


    [例子]

    给个例子便于理解

    #include <stdio.h>
    #include <stdlib.h>
     
    /* The calling function takes a single callback as a parameter. */
    void PrintTwoNumbers(int (*numberSource)(void)) {
        printf("%d and %d\n", numberSource(), numberSource());
    }
     
    /* A possible callback */
    int overNineThousand(void) {
        return (rand() % 1000) + 9001;
    }
     
    /* Another possible callback. */
    int meaningOfLife(void) {
        return 42;
    }
     
    /* Here we call PrintTwoNumbers() with three different callbacks. */
    int main(void) {
        PrintTwoNumbers(&rand);
        PrintTwoNumbers(&overNineThousand);
        PrintTwoNumbers(&meaningOfLife);
        return 0;
    }

    [参考]

    http://www.cppblog.com/converse/archive/2010/04/19/113023.html

    http://baike.baidu.com/link?url=xOLtuS1ByJ6Jzriff2ENr4g5O8bmUucVPKW31FojJaNZUMC9gEmQfAaOOMdl1GtDjK50wOIUkIRdv2zZuB_9L_

    http://en.wikipedia.org/wiki/Callback_(computer_programming)


    转载请注明:http://blog.csdn.net/u012606927/article/details/18005791

    展开全文
  • 回调函数 数组

    千次阅读 2016-05-12 09:28:49
    C语言回调函数–数组 续接上一节 ...根据上述的特点回调函数非常适用于嵌入式系统中菜单、功能选择、GUI等功能的编写。一、首先使用typedef声明执行函数的指针类型,返回值类型、参数类型 格式:typedef void (*PF
  • 将类成员函数用做C回调函数 提出问题:  回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误,...
  • 回调函数

    2013-09-25 14:46:43
    一,回调函数  我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理、用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子...
  • 本文档介绍C语言中的回调函数 回调函数是C语言的一种常用的高级应用,在库函数和应用程序中都有广泛的应用。 要点: 1.回调函数的调用方式 2.回调函数的完全形式的参数传递原则 3.C语言库函数的回调函数使用 回调...
  • 回调函数 callback

    2018-04-12 21:22:14
    转载自: 地址:http://blog.csdn.net/andoubi/article/details/52103479 作者:Andoubi 何为回调...回调函数与普通函数最大区别在于函数的调用。对普通函数而言,函数实现者可以直接拿来用,可以直接将它放在mai...
  • 什么是回调函数

    万次阅读 多人点赞 2018-08-09 19:49:01
    什么是回调函数 In computer programming, a callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient ...
  • 回调函数简介,自己写一个简单的回调函数  什么是回调函数?  首先做一个形象的比喻: 你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我...
  • unity使用回调函数

    千次阅读 2019-10-30 13:30:45
    什么是回调函数? 将函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数。这个过程就叫做回调。主函数的执行完,回头再调用传进来的那个函数。 回调函数的作用通俗点讲就是完成了某个...
  • C语言回调函数–数组

    2018-08-15 10:38:50
    根据上述的特点回调函数非常适用于嵌入式系统中菜单、功能选择、GUI等功能的编写。 一、首先使用typedef声明执行函数的指针类型,返回值类型、参数类型  格式:typedef void (*PFUNCMD)() 即:返回值(指针名)...
  • 关于回调函数的理解

    千次阅读 2014-04-17 22:25:08
    最近项目中有几处用到了回调函数,分享一下心得
  • js 回调函数 3种用法

    千次阅读 2018-01-05 14:35:44
    js 回调函数大致有以下三种用法, 1,直接回调 2,call回调 3,apply回调 回调函数作用得当,减少代码冗余,代码可读性增强,代码维护也轻松很多。 什么要用到回调函数呢? 当有很多地方需要调用同一个函数,...
  • 关于nodejs中的回调函数理解

    千次阅读 2017-12-22 11:14:33
    Node的编程思维就是,所有的都是异步的,因此有了大量的回调函数回调函数,就是放在另外一个函数(如 parent)的参数列表中,作为参数传递给这个 parent,然后在 parent 函数体的某个位置执行。举个栗子:var f1 ...
  • 类中静态回调函数应用

    千次阅读 2014-01-14 11:47:55
    回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。 分析原因: 普通的C++成员...
  • C语言 —— 回调函数

    千次阅读 多人点赞 2021-07-07 14:56:33
    void String(void* param) { char* str; str = (char*)param; printf("String:%s\n",str); } 该函数的形参表示可以接收任何类型指针 void *可以接受任何类型的指针
  • C/C++中回调函数初探   简介    对于很多初学者来说,往往觉得回调函数很神秘,很想知道回调函数的工作原理。本文将要解释什么是回调函数、它们有什么好处、为什么要使用它们等等问题,...
  • js中的回调函数,你有想过吗?

    千次阅读 多人点赞 2021-05-12 12:51:25
    前段时间腾讯三面(没看清要求,好像那个岗也要了解后端知识比如Redis但是我不会,已挂),有一个前端知识把我问懵了:请讲一下js中的回调函数回调函数是什么? 讲真,一直在用回调但是却压根没有想过,确实是我...
  • 回调函数,写的比较通俗易懂了

    千次阅读 2014-02-27 14:36:31
    回调函数   在看LWIP时,见到用回调函数,再看某老外公司OPC源代码时,见到用回调函数。看我国内某些代码(我公司软件等)时没用到。于是,我对回调函数产生了很大的好奇。以前,我写VC程序时用到过回调函数,...
  • Node.js —— 回调函数callback

    千次阅读 2017-12-05 12:47:33
    一、什么是回调函数 1、回调函数是作为参数传递给另一个函数 2、回调函数是一段可执行的代码段,它作为一个参数传递给其他的代码,其作用是在需要的时候方便调用这段(回调函数)代码 3、 函数运行完成,再执行...
  • 回调函数 回调函数就是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为一个参数传递给另一个参数,当这个指针被用来调用其所指向的函数时,这就是我们说的回调函数. 简单来说:回调函数就是把函数...
  • jQuery中一直有使用回调函数,比如: $(&amp;amp;quot;#btn&amp;amp;quot;).click(function() { alert(&amp;amp;quot;button clicked&amp;amp;quot;); }); example1: methods: { ...
  • 许多程序员都发现,利用MFC或者其它的C++应用编写回调函数是非常麻烦的,其根本原因是回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 104,027
精华内容 41,610
关键字:

回调函数的特点