很多人在问什么是回调?百度出来的答案基本都不正确,看了只会让人更加迷惑。下文试着用尽量简单的例子帮大家梳理清楚,因为回调并不是一句话下定义就能明白的概念,需要用一段文字像讲故事一样来说明,回调如同很多重要的计算机概念一样,它是有历史文化的,你需要知道它从哪里来,用来干什么,才能理解及在实际生产中应用。
回调,是非常基本的概念,尤其在现今NodeJS诞生与蓬勃发展中变得更加被人们重视。很多朋友学NodeJS,学很久一直摸不着门道,觉得最后在用Express写Web程序,有这样的感觉只能说明没有学懂NodeJS,本质上说不理解回调,就不理解NodeJS。
NodeJS有三大核心:
- CallBack回调
- Event事件
- Stream流
先来看什么不叫回调,下面是很多网友误认为的回调:
//代码示例1
//Foo函数意在接收两个参数,任意类型a,和函数类型cb,在结尾要调用cb()
function Foo(a, cb){
console.log(a);
// do something else
// Maybe get some parameters for cb
var param = Math.random();
cb(param);
}
//定义一个叫CallBack的函数,将作为参数传给Foo
var CallBack = function(num){
console.log(num);
}
//调用Foo
Foo(2, CallBack);
以上代码不是回调,以下指出这里哪些概念容易混淆:
- 变量CallBack,被赋值为一个匿名函数,但是不因为它名字叫CallBack,就称知为回调
_ Foo函数的第二个形式参数名为cb,同理叫cb,和是不是回调没关系
_ cb在Foo函数代码最后被以cb(param)的形式调用,不因为cb在另一个函数中被调用,而将其称之为回调
直白来讲,以上代码就是普通的函数调用,唯一特殊一点的地方是,因为JS有函数式语言的特性,可以接收函数作为参数。在C语言里可以用指向函数的指针来达到类似效果。
讲到这里先停一下,大家注意到本文的标题是解读异步、回调和EventLoop,回调之前还有异步呢,这个顺序对于理解很有帮助,可以说理解回调的前提,是理解异步。
说到异步,什么是异步呢?和分布、并行有什么区别?
回归原始,追根溯源是我们学习编程的好方法,不去想有什么高级的工具和概念,而去想如果我们只有一个浏览器做编译器和一个记事本,用plain JS写一段异步代码,怎么写?不能用事件系统,不能用浏览器特性。
小明:刚才上面那