0x00 before
以前一直对回调有些迷糊,似懂非懂,虽然能明白用法和原理,但总有些小疑问,比如,为啥偏要用回调。今天集中看了很多博客,再配合上SOME的理解,感觉收获颇多,故给大家一起分享。
0x01 什么是JS的回调函数
见网上有人说:函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b。那么这个过程就叫回调。
其实并不全对,函数a执行过程中执行了函数b,那也是回调。在我觉得回调的关键其实就是在正常处理的函数体中,去嵌套一个可变的灵活函数来辅助我们完成一些复杂的工作。
语言太乏力,代码见人心:
//这是一个正常函数
function people(weapon) {
alert("我是一个兵!");
weapon();
}
//准备回调的函数A
var A = function (){
alert("我有一把手枪!");
}
//准备回调的函数B
var B = function (){
alert("我有一挺机关枪!");
}
people(A) //这是一个装备了手枪的士兵
people(B) //这是一个装备了机关枪的士兵
上面就是一个最简单的回调。
以前我一直有个疑问,这不是多此一举吗,直接调用函数也可以办到啊!为什么要这么做呢?
其实回调的第一个好处就是:灵活! 你想想,如果你写死了代码,以后想为士兵换武器怎么办?在这里,将需要调用的函数当作参数传给一个”正常“的函数,我们就可以在不修改原功能代码的情况下,随意扩展!
仅仅是这样?那也只是按顺序执行了一个自定义的函数而已,感觉和回调这两个完全没有关系啊!
0x02 异步回调,方显真正威力
的确,上面的例子完全没有体现出回调的魅力,至少,回调中的”回”字,我们并没有一个直观的感受。
其实回调也分两种,同步回调和异步回调,刚刚的就是同步回调,函数按顺序执行,只不过是有一个自定义的函数功能,其它语言里指针和引用其实也可以做到类似的功能。
我觉得JS中的回调真正厉害的地方是异步的回调,它不仅让我们可以自定义处理的函数,还可以让我们决定什么时候触发这个函数,并且主进程不会因为这个函数而阻塞。