js回调函数的使用

柔情只为你懂 2021-09-21 10:34 600阅读 0赞

在第一次学js的时候,估计很多人对回调函数很蒙,今天有空梳理总结下回调函数,算是一次学习,算是一次总结,也算是一次分享。

文章目录

    • 回调函数执行流程
    • 回调小demo
    • js中回调无处不在
    • 使用回调函数注意事项

回调函数执行流程

fun是被调用的函数,在调用fun函数时传递一个被回调的函数callback,1、2、3、4为执行步骤,箭头指向为调用。
在这里插入图片描述
执行流程:
1)在代码中,fun首先被执行
2)fun函数执行,js的执行转移到fun函数内部,fun函数内部的语句从上往下执行
3)在fun函数中调用callback
4)在调用fun函数时传入的函数(callback)被执行
5)执行callback函数中的内容

回调小demo

如果把上面的流程转换成简单的代码它是这样的

  1. function fun(callback){
  2. console.log("fun执行");
  3. callback();// 调用过程可以传递参数
  4. }
  5. function sayHello(){
  6. console.log("callback:hello world")
  7. }
  8. //把sayHello当做但是传递给fun函数
  9. fun(sayHello);
  10. //执行结果
  11. fun执行
  12. callback:hello world

匿名函数简写方式

  1. function fun(callback){
  2. console.log("fun执行");
  3. callback();// 调用过程可以传递参数
  4. }
  5. // 调用
  6. fun(function(){
  7. console.log("回调执行了")
  8. });
  9. // es6
  10. fun(()=>{
  11. console.log("回调执行了")
  12. });
  13. // 输出
  14. fun执行
  15. 回调执行了

我们知道js中的对象有基本数据类型(Number、String…)、函数、数组这几类,是对象就可以当做参数进行传递,当我们把一个函数当做参数传递给函数时,这个函数就称为一个回调函数,根据这个判断,当我们调用js方法时,括号中如果出现function或者箭头函数,则说明咱们传递的就是一个回调函数。

回调算是一种程序的设计模式,在java中也有回调函数,那些类名常常包含Handler的类就是java中传递的匿名对象,JDK8的升级带来了lambda,Java中那些能用lambda代替的匿名对象都是Java的回调方法,例如接口实现线程的run方法就是很经典的回调。

js中回调无处不在

一些常见的回调。

  1. # ajax请求回调
  2. $.post({
  3. url: "https://xxxx.com/api/xxx",
  4. dataType:"json",
  5. data:{ },
  6. // 回调 es6
  7. success: res=>{
  8. // TODO
  9. },
  10. // 回调
  11. error: err =>{
  12. // TODO
  13. }
  14. });
  15. # 数组方法
  16. let arr = [0,1,2];
  17. arr.forEach(function(item,index){
  18. // TODO
  19. });
  20. # jQuery事件回调
  21. $("#btn").click(function(){
  22. // TODO
  23. })
  24. # promise中的回调
  25. new Promise(
  26. function (resolve, reject) {
  27. // 一段耗时的异步操作
  28. resolve('成功') // 数据处理完成
  29. // reject('失败') // 数据处理出错
  30. }
  31. ).then(
  32. (res) => { console.log(res)}, // 成功
  33. (err) => { console.log(err)} // 失败
  34. )

除了以上这些还有我们在vue中见到的各种生命周期钩子函数也是回调,回调在js这门语言中用到了出神入化,现在,我们应该反观为什么js中用了那么多回调函数?
一些原因:
1)javascript是典型的函数式编程语言,顺应其特点,在js中才会出现这么多回调函数
2)“回调”这种编程语言的组织和设计模式是很优秀的
3)回调函数使用特别灵活,通过可以拿回函数内部的数据,可以进行异步的处理(特别是在ajax请求)等

使用回调函数注意事项

当回调是一个使用this对象的方法时,我们要改变下调用回调函数的方式来保持this对象上下文。否则当回调传给一个全局函数的时候,this对象将会指向全局window对象。或者它会指向包含这个方法的对象。

  1. let outerThis = this;
  2. $.ajax({
  3. url: this.data.app.BASE_URL + "/calendar/setRemind",
  4. method: "POST",
  5. dataType: "json",
  6. data: { },
  7. success: res => {
  8. // 此处的this指向包含success_callback的ajax函数
  9. // 在这里通常用 outerThis 外部的this
  10. },
  11. });

如果是自己函数中用到了回调。我们可以通过使用Call或者Apply函数执行callback来解决解决之前的问题,这两个方法用于设置函数中的this对象并且传入参数。

Call把第一个参数的值用于函数内的this对象,然后剩下的参数独立地传给函数(通过逗号分隔)。Apply函数也是把第一个参数的值用于函数内的this对象,第二个参数是一个传给对象的数组(或者arguments对象)。

  1. // 这里我们为回调对象加了个参数this_obj
  2. function fun(callback, this_obj) {
  3. // 其他操作
  4. // 用apply函数把this指向callbackObj
  5. callback.apply (this_obj, [data1, data2]);
  6. }
  7. // 使用
  8. let outerThis = this;
  9. fun((data1,data2)=>{
  10. // 此时 this等于outerThis
  11. },this);

参考
https://www.zcfy.cc/article/understand-javascript-callback-functions-and-use-them-javascript-is-sexy
https://juejin.im/post/6844903987771097102
https://www.cnblogs.com/moltboy/archive/2013/04/24/3040213.html


想了解作者更多,请移步我的个人网站,欢迎交流、留言~
极客技术空间:https://elltor.com/

发表评论

表情:
评论列表 (有 0 条评论,600人围观)

还没有评论,来说两句吧...

相关阅读

    相关 js函数

    一个函数被作为参数传递给另一个函数(在这里我们把另一个函数叫做otherFucntion),回调函数在otherFunction中被调用 回调函数原理:     

    相关 js函数

    1:回调函数: 定义了,但没有调,但最终执行了 2: dom事件回调函数 定时器回调函数 ajax请求回调函数 生命周期回调函数 documen

    相关 有关js函数

    函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b。那么这个过程就叫回调。 其实中文也很好理解:回调,回调,就是回头调用的意思。函数a的事先干完,回头再调用函

    相关 js函数

    平常的前端开发工作中,编写js时会有很多地方用到函数的回调。 最简单的例子就是: <script language="javascript" type="text/

    相关 js函数错误

    由java后台根据判断 返回js需要调用的函数,但是在运行的时候判断为不是函数。但是检查js文件后确实有该名称的函数存在。所以添加eval()函数。不要在运行的js函数中添加,

    相关 js函数使用

    在第一次学js的时候,估计很多人对回调函数很蒙,今天有空梳理总结下回调函数,算是一次学习,算是一次总结,也算是一次分享。 文章目录 回调函数执行流程