在写网页小游戏和javascript的回调函数杠上了,之前看了好多大牛写的帖子,比如回调是一个函数的指针,回调是用来刷新canvas的画布,回调多用setTimeout和setInterval,还有异步操作数据库,比如ajax,感觉林林总总的,能不能大家集思广益,总结一下js的回调到底能干嘛,主流的技术层面都用callback来干嘛?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
你们这些读书人,就爱搞这么多复杂的名词和定义,回调函数不就是一个参数吗?当你自己打包方法的时候发现用return来返回数据不行,那就用回调函数来接收返回的数据咯。或者觉得这个方法就可以决定下一步该怎么做,就用回调函数
比如我自己写一个方法,这个方法的功能是获取web接口数据,并判断数据是否符合要求,不符合直接报错了,符合就调用你传进来的函数。这样你在回调函数内写任何东西,都会在判断成功之后执行,而如果你用的是return,你还要在callback内做判断(事实上我这个例子也用不了return,因为数据的获取不是同步的)
回调函数就是在执行了一个东西了之后,你可以有一个东西实现你想用执行的返回结果干些什么事情的东西,或者说是在执行完当前的东西你还想继续干些什么的一个参数;什么指针啊什么的,不用想得这么深奥。
举个例子:
caonima函数定义了一个回调函数的callback参数,用于传入你想执行的自定义函数,就是回调函数,上面的代码相当于下面的代码:
对比这两种写法,我觉得第二种写法没有第一种写法爽,第一种写法封装性更好,比如caonima函数不够完善,然后就会留一个 接口,让你传入回调函数继续处理,这样就避免去修改第一个函数;或者第一个函数是你写的,可能你觉得你写得不够完善,你也可以留这么一个接口,让下一个人使用的时候,直接传入回调函数进行他想要的处理;同样的,这种写法让程序的扩展性更强,逻辑更清晰,至少我是这么认为的。
我看关于这个回答有很多人距离ajax,这个比较经典,因为ajax是异步处理的,也就是不同步的,不可能像第二种那样先是var c = caonima(a,b); haha(c);
为什么呢?因为是异步的,所以haha的执行并不一定需要等到caonima(a,b);执行完才执行,haha(c);可能会先比caoniama先执行;那么先执行haha肯定会出错!!!!!
如果用回调函数的方式,caonima执行完了之后,肯定会调用haha这个函数,因为在caonima函数里执行的程序是同步的。当然,我举这个例子并不是说我这里的示例代码是异步的,这仅仅是做个假设,主要是解释ajax。
建议你看看ajax面向对象相关的资料,很多东西你就明白了。
你就这样理解:
callback回调函数就是通知关心你业务处理结果的小伙伴一个接口,
其它小伙伴就可以根据你的结果来执行他们的业务逻辑
回调有同步回调和异步回调
JS里面用的最多的应该是作为事件的处理器。即当一个事件发生时,用来响应事件的函数。
比如:
当AJAX请求成功时,你要用回调函数读取响应数据。
当按钮被点击时,你要用回调函数执行对应的逻辑。
实际上,setTimeout和setInterval的回调函数也可以看作是事件处理器,对应“时间到”这个事件。
数组的map、forEach方法的回调函数也是如此。
JS的世界就是一个事件的世界。
搞那么复杂干嘛啊。
回调函数,直白一点解释就是
某件事情干完之后可以干什么 || 满足某些条件之后干什么
比如运动,
比如ajax中当请求成功丢个函数在这里
有的函数的参数,就是一个函数,但是这个是函数的参数不一定叫做回调函数啊。
比如setTimeout/setInterval中的函数参数,我个人觉得没有必要把他理解为回调函数吧!语义不符合嘛。
打个比方,你身份证到期了,要去派出所拍摄新证,一般派出所是30天才可以拿新证件。 。。。
用同步的思想来解释这件事情就是
你(主线程,当然js只有一个主线程),跑去派出所办证(调用 createNewIDCard(yourFace)方法),拍完了,你住在派出所30天,期间你哪儿都不能去,只能傻等,第31天了派出所把新证件给了你(return newCard)。
用异步+回调的思想来解释这件事情就是
你(主线程,当然js只有一个主线程),带着你的爹(callback),跑去派出所办证(调用 createNewIDCard(yourFace,callback)方法),拍完了,你高高兴兴的离开派出所干别的事情去了,你把你爹留在派出所,让他在那边住30天,等到31天了,他会把新的证件给你带回来。
xx你来给我干这个活,干完了记得按一下这个按钮,至于这个按钮按下去会怎么样不知道但是这个按钮被人按了就可以确定xx把这个货已经干完了.
至于他什么时候干完这个就不管了.
回调是把return存下来调它才执行