callback回调函数理解 相当于this指针

1.callback函数在微软的官方手册中是这样定义callback函数的:“callback函数是由应用程序定义而由操作系统调用的函数”。   
凡是由用户设计而却由windows系统调用的函数,统称为callback函数,这些函数都有一定的类型,以配合windows的调用操作。     
 某些api函数以callback作为其参数之一,这些api,如settimer、linedda、enumobjects.通常这种api会在进行某 种行为之后或满足某种状态之时调用该callback函数。另外,如果类的成员函数是一个callback函数,它必须被声明为”static”,才能把 c++编译器加诸于函数的一个隐藏参数this去掉。     
那为什么要去掉this指针呢?因为callback函数是给windows函数调用的,windows并不借助任何对象调用该函数。如果去掉 static的话,就会导致堆栈中有一个随机变量会成为this指针,而结果就是程序的崩溃。记住:凡在类中声明为static的东西都并不和对象结合在一起,它们是类的一部分,不属于对象。

2.打个比方,有一家旅馆提供叫醒服务,但是要求旅客自己决定叫醒的方法。可以是打客房电话,也可以是派服务员去敲门,睡得死怕耽误事的,还可以要求往自己头上浇盆水。这里,“叫醒”这个行为是旅馆提供的,相当于库函数,但是叫醒的方式是由旅客决定并告诉旅馆的,也就是回调函数。而旅客告诉旅馆怎么叫醒自己的动作,也就是把回调函数传入库函数的动作,称为登记回调函数(to register a callback function)。如下图所示(图片来源:维基百科):

回调机制的优势

从上面的例子可以看出,回调机制提供了非常大的灵活性。请注意,从现在开始,我们把图中的库函数改称为中间函数了,这是因为回调并不仅仅用在应用和库之间。任何时候,只要想获得类似于上面情况的灵活性,都可以利用回调。
这种灵活性是怎么实现的呢?乍看起来,回调似乎只是函数间的调用,但仔细一琢磨,可以发现两者之间的一个关键的不同:在回调中,我们利用某种方式,把回调函数像参数一样传入中间函数。可以这么理解,在传入一个回调函数之前,中间函数是不完整的。换句话说,程序可以在运行时,通过登记不同的回调函数,来决定、改变中间函数的行为。这就比简单的函数调用要灵活太多了。请看下面这段Python写成的回调的简单示例:

<script>
        function a(callback){
            alert("主函数执行完了!");
            callback();
        }
        function b(){
            alert("回调函数b!");
        }
        function c(){
            alert("回调函数c!");
        }
        // callback函数以参数形式传递,保证变量的灵活性
        a(b);
        a(c);
</script>
                        

解答:

使用函数做参数就有下面的好处:当你a(b)的时候函数b就成了回调函数,而你还可以a(c)这个时候,函数c就成了回调函数。如果你直接在函数a里调用的话,这个回调函数就被限制死了。如果你写成了function a(){...;b();}就失去了变量的灵活性。

时间: 2024-10-14 07:05:52

callback回调函数理解 相当于this指针的相关文章

Python 多进程实战 & 回调函数理解与实战

这篇博文主要讲下笔者在工作中Python多进程的实战运用和回调函数的理解和运用. 多进程实战 实战一.批量文件下载 从一个文件中按行读取 url ,根据 url 下载文件到指定位置,用多进程实现. #!/usr/local/python27/bin/python2.7 from multiprocessing import Process,Pool import os,time,random,sys import urllib # 文件下载函数 def filedown(url,file):  

关于js的callback回调函数的理解

回调函数的处理逻辑理解: 所谓的回调函数处理逻辑,其实就是先将回调函数的代码 冻结(或者理解为闲置),接着将这个回调函数的代码放到回调函数管理器的队列里面. 待回调函数被触发调用的时候,对应的回调函数的代码才会从管理器队列取出来并自动执行(激活回调函数的代码),实现异步的编程效果. 不过,对于一些必须要等回调函数执行完毕才可以确定的动作,实际上,就是会掉入一个层层回调的局面了.这点也是回调函数的复杂的地方! 换句话说,只要您要获取的值是要被回调才确定的,那接下来的所有代码都必须用回调的方式来编写

callback回调函数的理解

callback采用的设计模式是:模板模式,他的设计理念是基于面向对象中的多态的. 我们的程序中走到某个地方他会出现不一样的动作的时候,我们在这儿就使用回调函数.我们利用的就是 多态的原理,我们传递不同的类过来的时候就会出现不一样的动作. public class PaintFrame {    public static void drawPaint(MyFrame m){        System.out.println("1111111");        System.out

思考5 定时器和callback回调函数

定时器 频率:freq 占空比:duty 输出脉冲中断信号(定时器中断):callback(回调函数) 回调函数;回调函数就是按照一定的形式由你定义并编写实现内容,当发生某种事件时(如中断发生),而由系统或其它函数来调用的函数. 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数. 回调函数是不是就可以理解为,中断发生时,调用函数的指针,执行我预先想要处理的内容(中断处理函数) 原文地址:http

JavaScript之callback回调函数

以下内容借鉴老鸟的经验和知识,结合自己的学习,精髓的总结. 一句话:对于以后研究node 和那些热门的前端框架 很有帮助.如果你看过这个文章,对于你来说是质的突变. 理解javascript中的回调函数(`callback`),希望对你有所帮助. 在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,和其它String.Array.Number.Object类的对象一样用于内置对象的管理. function实际上是一种对象,它可以"存储在变量中,通过参数传递给(别一

回调函数理解实例

// callback.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stdio.h> void printWelcome(int len) { printf("欢迎欢迎 -- %d\n", len); } void printGoodbye(int len) { printf("送客送客 -- %d\n&q

callback回调函数--python

编程分为两类:系统编程(system programming)和应用编程(application programming).所谓系统编程,简单来说,就是编写库:而应用编程就是利用写好的各种库来编写具某种功用的程序,也就是应用.系统程序员会给自己写的库留下一些接口,即API(application programming interface,应用编程接口),以供应用程序员使用.所以在抽象层的图示里,库位于应用的底下. 当程序跑起来时,一般情况下,应用程序(application program)会

如何写JavaScript中的callback回调函数

如何写回调函数? 如果自己在写一个方法或函数,你有可能会遇到需要一个回调函数.下面就是一个简单的常见回调函数例子: function mySandwich(param1, param2, callback) { alert('Started eating my sandwich.\n\nIt has: ' + param1 + ', ' + param2); callback(); } //调用该方法函数 mySandwich('ham', 'cheese', function() { aler

那么今天的内容是 callback 回调函数的使用和 基础

还是先贴代码吧 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/jquery.js"></script> </head> <style> body{font-family: "微软雅黑";width: 980