一、什么是回调函数
回调函数,也被称为高阶函数,是一个被作为参数传递给另一个函数(在这里我们把另一个函数叫做“otherFunction”)的函数,回调函数在otherFunction中被调用。当使用一些异步的函数来实现的回调我们称为异步回调。
二、回调地狱
由多层嵌套的回调函数组成的代码称为回调地狱,多数在写阻塞执行代码的时候会产生。回调地狱的代码可读性差,很难让人弄清楚业务逻辑。
下面便是回调地狱的代码例子`
listen('click',function handler(evt){
setTimeout(function request(){
ajax("http://some.url.1",function response(text){
if(text==='hello'){
handler();
}
else{{
request();
}}
})
})
},1000)
上面的代码执行4秒后会输出’回调结束‘,虽然达到了我们要阻塞执行的目的,但是非常不容易让人读懂,且书写麻烦,而且维护起来也会很费劲,理解起来也困难。
三、信任问题
如果说回调地狱带来的是一些维护编写和杂乱的思维上的麻烦,那么信任问题可能会发现一些无法预期的问题,甚至一些安全问题。
控制反转,当你把你的程序的一部分交给第三方来执行控制时,就会发生控制反转,而第三方发生的一些具体事宜通常是不能由你掌控的。
比如你要设置一个支付功能,为了提高用户体验和性能,你使用了回调函数,且用了一个第三方的异步函数,你的预期是当第三方完成后,然后回调使用你已经写好的支付回调函数,但是由于某些原因可能会发生以下情况:
1、回调函数被多次调用
2、没有调用回调函数
3、回调函数没有被执行
4、回调函数延迟执行
…
而发生上面的情况,你可能收不到钱,甚至让用户多付钱而被投诉。
四、总结
回调地狱带来的异步流程的方式是非线性,非顺序的,这使得我们增大了推导这样的代码的难度,难以理解代码而容易发生Bug
更重要的是,回调可能会发生控制反转的影响,因为回调把控制权交给第三方(而第三方工具通常不是受我们控制的)来调用你的代码。这种控制反转导致一系列的麻烦的信任问题,使得回调的结果可能和我们的预期不一样。
虽然我们可能使用一些方法来逐一解决信任问题,但你可能看到了,信任问题产生的问题很多,全部解决这些问题的难度和复杂度是很高的。
所以我们期待有一些新的技术可能有更好的逻辑性已经不会产生信任问题,如promise等。