鱼C论坛

 找回密码
 立即注册
查看: 2243|回复: 11

[庖丁解牛] 0 2 3 1 ★ JavaScript的瑞士军刀-回调

[复制链接]
发表于 2018-12-6 15:26:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 不二如是 于 2018-12-10 14:00 编辑




                               
登录/注册后可看大图


最近准备《零基础入门学习Web开发》(JavaScript)的材料,突然发现关于“回调”的玩法,没有好好说一说。

首先来给大家科普一下何为“callback(回调)”

大学老教授的定义:
在JavaScript中,函数是对象。因此函数可以将函数作为参数,并且可以由其他函数进行返回。执行此操作的函数称为高阶函数。任何作为参数传递的函数都称为回调函数。


个人定义:
回调就是一个在另外一个函数执行完后要执行的函数


JavaScript 是单线程工作,这意味着两段脚本不能同时运行,而是必须一个接一个地运行。

在《零基Web开发》(H5 & C3)的006 - 为网页注入灵魂 中小甲鱼老师讲过哈。

我们人类是基本上是多线程工作的状态,可以使用多个手指打字,可以一边开车一边与人交谈。

唯一一个会妨碍我们的是:
游客,如果您要查看本帖隐藏内容请回复


因为当我们执行这个行为的时候,所有当前进行的活动在那个瞬间都必须暂停。

如果代码中出现这种,一停全停的方法,除非是故意设计,否则很尴尬!

JavaScript由于单线程限制,防止阻塞,只能通过异步函数的调用方式,把需要延迟处理的事件放入事件循环队列。

到目前为止,回调是编写处理JavaScript程序异步逻辑的最常用方式。




为什么需要callback?

很简单,就像上一篇介绍的柯里化,因为有实际用途!

需要通回调函数处理异步相关的逻辑,理论过于生硬,我们还是来上代码:
  1. function first(){ console.log(“鱼C”);}
  2. function second(){ console.log(“小甲鱼”);}
  3. first();
  4. second();
复制代码


不出所料,正常输出:
Snip20181207_54.png


我们人工模拟一个“打喷嚏”扔到first()中,让其无法立即执行,会发生什么?

例如,我们必须发送请求然后等待结果响应的API请求

为了模拟API请求,我们可以使用setTimeout()定时器来模拟一下。

我们将函数延迟666毫秒来模拟请求,修改代码:
  1. function first(){
  2.         // 模拟相应等待
  3.         setTimeout( function(){
  4.             console.log("鱼C");
  5.         }, 666 );
  6.     }
  7.     function second(){ console.log("小甲鱼");}
  8.     first();
  9.     second();
复制代码


会发生神马呢,测试下:
Snip20181207_55.png


先输出second()了,我们希望的顺序先执行first(),再执行second()。

但是由于JavaScript是异步的,所有的延迟处理都要放入循环队列里,因此事与愿违,不能按照我们的希望顺序输出。

如果希望这段代码按照我们的意愿输出,我们可以使用回调函数,确保某些代码执行完了,再执行另外一段代码。




创建callback

铺垫了这么多,是时候教大家如何创建callback了,直接上代码:
  1. function doHomework(subject) {
  2.         alert(`我爱学习 《${subject}》 ,小甲鱼的教程好hi哦.`);
  3.     }

  4.     doHomework('零基础入门学习Scratch');
复制代码


上面我们创建了doHomeWork的函数,我们接受一个变量,通过控制台调用,将得到如下结果:
Snip20181207_58.png


接着,我们开始添加回调,在doHomework函数中添加一个参数callback,然后在第二个参数中回调我们定义的函数。

代码如下:
  1. function doHomework(subject, callback) {
  2.         alert(`我爱学习 《${subject}》 ,小甲鱼的教程好hi哦.`);
  3.         callback();
  4.     }
复制代码


调用:
  1. doHomework('零基础入门学习Scratch',function () {
  2.         alert("我爱小甲鱼");
  3.     });
复制代码


正如我们希望的,我们在控制台里运行上述代码,将会受到两个连续的alert:
Dec-07-2018 13-57-46.gif


但是回调函数并不是非得在调用函数中定义,我们可以单独定义,修改后的代码如下:
  1. function loveFishc(){
  2.         alert('我爱小甲鱼')
  3.     }

  4.     doHomework('零基础入门学习Scratch',loveFishc);
复制代码


输出结果和上面一样。

怎么样学会了不?!

异步编程是一种编程理念,用于推迟事件以便以后执行。

当我们处理异步任务时,回调是一种解决方案,以便它们按顺序执行。

如果我们有多个任务依赖于前几个任务的结果,那我们就要使用多个嵌套回调,但是就会引发“回调地狱”
(过多的回调嵌套会使得代码变得难以理解与维护)

不过,能写成回调地狱,也是水平达到一定高度才会发生的事情,初学者不用担心哈。


                               
登录/注册后可看大图








如果喜欢,别忘了评分


                               
登录/注册后可看大图


这位鱼油,如果喜欢本系列Js帖子,请订阅 专辑☞传送门)(不喜欢更要订阅

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-6 15:32:40 | 显示全部楼层
好奇,期待更新
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-7 15:58:11 | 显示全部楼层
妨碍我们的到底是神马
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-10 17:12:11 | 显示全部楼层
打喷嚏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 09:31:05 | 显示全部楼层
b
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-11 10:21:38 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-19 20:37:30 | 显示全部楼层
123
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-18 18:54:41 | 显示全部楼层
什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-20 22:44:19 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-4 16:01:33 | 显示全部楼层
回调函数原理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-14 12:28:48 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-15 11:37:49 | 显示全部楼层
想不到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 09:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表