马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 不二如是 于 2018-12-10 14:00 编辑
最近准备《零基础入门学习Web开发》(JavaScript)的材料,突然发现关于“回调”的玩法,没有好好说一说。
首先来给大家科普一下何为“callback(回调)”。
大学老教授的定义:
在JavaScript中,函数是对象。因此函数可以将函数作为参数,并且可以由其他函数进行返回。执行此操作的函数称为高阶函数。任何作为参数传递的函数都称为回调函数。
个人定义:
JavaScript 是单线程工作,这意味着两段脚本不能同时运行,而是必须一个接一个地运行。
在《零基Web开发》(H5 & C3)的006 - 为网页注入灵魂 中小甲鱼老师讲过哈。
我们人类是基本上是多线程工作的状态,可以使用多个手指打字,可以一边开车一边与人交谈。
唯一一个会妨碍我们的是:
因为当我们执行这个行为的时候,所有当前进行的活动在那个瞬间都必须暂停。
如果代码中出现这种,一停全停的方法,除非是故意设计,否则很尴尬!
JavaScript由于单线程限制,防止阻塞,只能通过异步函数的调用方式,把需要延迟处理的事件放入事件循环队列。
到目前为止,回调是编写和处理JavaScript程序异步逻辑的最常用方式。
为什么需要callback?
很简单,就像上一篇介绍的柯里化,因为有实际用途!
需要通回调函数处理异步相关的逻辑,理论过于生硬,我们还是来上代码:function first(){ console.log(“鱼C”);}
function second(){ console.log(“小甲鱼”);}
first();
second();
不出所料,正常输出:
我们人工模拟一个“打喷嚏”扔到first()中,让其无法立即执行,会发生什么?
例如,我们必须发送请求然后等待结果响应的API请求?
为了模拟API请求,我们可以使用setTimeout()定时器来模拟一下。
我们将函数延迟666毫秒来模拟请求,修改代码:function first(){
// 模拟相应等待
setTimeout( function(){
console.log("鱼C");
}, 666 );
}
function second(){ console.log("小甲鱼");}
first();
second();
会发生神马呢,测试下:
先输出second()了,我们希望的顺序先执行first(),再执行second()。
但是由于JavaScript是异步的,所有的延迟处理都要放入循环队列里,因此事与愿违,不能按照我们的希望顺序输出。
如果希望这段代码按照我们的意愿输出,我们可以使用回调函数,确保某些代码执行完了,再执行另外一段代码。
创建callback
铺垫了这么多,是时候教大家如何创建callback了,直接上代码:function doHomework(subject) {
alert(`我爱学习 《${subject}》 ,小甲鱼的教程好hi哦.`);
}
doHomework('零基础入门学习Scratch');
上面我们创建了doHomeWork的函数,我们接受一个变量,通过控制台调用,将得到如下结果:
接着,我们开始添加回调,在doHomework函数中添加一个参数callback,然后在第二个参数中回调我们定义的函数。
代码如下:function doHomework(subject, callback) {
alert(`我爱学习 《${subject}》 ,小甲鱼的教程好hi哦.`);
callback();
}
调用: doHomework('零基础入门学习Scratch',function () {
alert("我爱小甲鱼");
});
正如我们希望的,我们在控制台里运行上述代码,将会受到两个连续的alert:
但是回调函数并不是非得在调用函数中定义,我们可以单独定义,修改后的代码如下:function loveFishc(){
alert('我爱小甲鱼')
}
doHomework('零基础入门学习Scratch',loveFishc);
输出结果和上面一样。
怎么样学会了不?!
异步编程是一种编程理念,用于推迟事件以便以后执行。
当我们处理异步任务时,回调是一种解决方案,以便它们按顺序执行。
如果我们有多个任务依赖于前几个任务的结果,那我们就要使用多个嵌套回调,但是就会引发“回调地狱”。
(过多的回调嵌套会使得代码变得难以理解与维护)
不过,能写成回调地狱,也是水平达到一定高度才会发生的事情,初学者不用担心哈。
如果喜欢,别忘了评分 :
这位鱼油,如果喜欢本系列Js帖子,请订阅 专辑☞( 传送门)( 不喜欢更要订阅 )
|