callback (回调)函数讲解
回调函数1. 前置知识在讲什么是回调函数之前,我们要对JavaScript的函数前置知识进行补充:js的函数,可以是一种数据类型,又可以充当一个参数,甚至充当返回值2. 什么是回调函数?通俗来说就是可以将一个函数当作另一个函数的形参来传递。格式如下:function A (形参1, 形参2, 函数B) {do something;}上面这是声明时的写法,你一定很好奇,那“函数B” 你说它是个函数,
回调函数
1. 前置知识
在讲什么是回调函数之前,我们要对JavaScript的函数前置知识进行补充:
js的函数,可以是一种数据类型,又可以充当一个参数,甚至充当返回值
2. 什么是回调函数?
通俗来说就是可以将一个函数当作另一个函数的形参来传递。格式如下:
function A (形参1, 形参2, 函数B) {
do something;
}
上面这是声明时的写法,你一定很好奇,那“函数B” 你说它是个函数,它什么方法都没有啊?
其实你可以先声明一个function 函数B ()
这样子的,又可以在调用的时候才去实现这个方法。
function A (形参1, 形参2, 函数B) { do something;}
A(传入形参1, 传入形参2, 函数B() {
这里是函数B的实现方法体
})
3. 回调函数有什么用?
那这样有什么作用呢?回调函数是NodeJs中异步编程很重要的一个知识。例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。
简单讲一下,什么是异步编程:
异步也就是多个事件不同时发生,如事件A要使用事件B的结果来进行下一步的操作时,事件A可以先执行前面的,然后等待事件B运行完拿到想要的数据再进行下一步操作。所以,事件A需要等待事件B。你可以这样理解,要等待的就是异步编程。这样可以让你快速有点头绪,其实也不全是这样……
举个简单的例子:
我要完成一个简单加法运算,但是有个条件:传入参数和最后运输返回是异步的。
这个案例不难,等待就是异步,那加个setTimeout不就是等待了嘛
function add (x, y) {
// 设置1秒后出计算结果
console.log('开始运算')
setTimeout (function () {
// 保存计算结果
console.log('保存计算结果')
var result = x + y
return result
}, 1000)
console.log('结束运算')
}
// 打印返回值结果
console.log('计算结果为:'+add(1, 2))
- 运行一下
- 结果分析
undefined ?为什么会是这个结果?
从执行顺序上来看我们就可以得出结论,
打印返回值结果 这一步并没有等待到 setTimeout 里面相加这步运行结束就已经打印结果了 ,所以返回结果为undefined。
我们要做的就是得到setTimeout里面的返回值。
我们来用callback函数改写一下上面的案例
function add (x, y, callback) {
// 设置1秒后出计算结果
console.log('开始运算')
setTimeout (function () {
// 保存计算结果
console.log('保存计算结果')
var result = x + y
callback(result)
}, 1000)
console.log('结束运算')
}
add(1, 2, function (result) {
// 这是callback函数实现体
console.log('计算结果为:'+result)
})
这个函数的执行流程就是:传入x, y -> add跳过等待 -> add执行结束 ->setTimeout开始计算结果 -> 将计算结果当作callback函数的参数 -> callback函数实现体。
作用就是将异步的计算结果当作另一个函数的形参转发出去了。相当于你写多一个方法来保存这个计算结果。
- 运行结果
总结:
回调函数不难理解,你就把它当作一个形参来使用就好。多练习一下就可以了。不过,企业开发中不推荐使用callback函数,建议异步处理使用es6的"async" & “await”。
更多推荐
所有评论(0)