1、回调函数的定义和概念
回调函数是一种特殊的函数,它作为参数传递给另一个函数,并在被调用函数执行完毕后被调用。
即:函数a的参数为函数b,当函数a执行完之后再去执行b
作用:回调函数通常用于事件处理、异步编程和处理各种操作系统和框架的API
2、代码展示
function a(callback) {
console.log("执行函数a!");
console.log("调用回调函数");
callback(); // 调用回调函数
}
function b(){ console.log("回调函数b"); }
function c() { console.log("回调函数c"); }
function execute(){ a(b); a(c); }
execute();
- 提问:为什么不直接把整个事情在函数a中写好,而是要通过一个参数进行回调呢?
- 回答:如果你直接写进去,function a(){...;b();},那就直接写死了,失去了变量的灵活性。当你要传入别的函数时,需要重新写一遍函数a
3、为什么需要回调
- JavaScript 在浏览器中运行,浏览器的主进程是单线程事件循环。如果我们尝试在单线程事件循环中,执行长时间运行的操作,则会阻止该过程。
- JavaScript 是按从上到下的顺序运行代码。在有些情况下,必须在某些情况发生之后,代码才能运行,这就不是按顺序运行了。这是异步编程。
- 回调函数确保:函数在某个任务完成之前不运行,在任务完成之后立即运行。它帮助我们编写异步 JavaScript 代码,避免问题和错误。
- 在 JavaScript 里创建回调函数的方法是:将它作为参数传递给另一个函数,然后当某个任务完成之后,立即调用它。
4、回调函数的作用和使用场景
回调函数是一种常见的编程技术,它可以在异步操作完成后调用一个预定义的函数来处理结果。回调函数通常用于处理事件、执行异步操作或响应用户输入等场景。
回调函数的作用是将代码逻辑分离出来,使得代码更加模块化和可维护。使用回调函数可以避免阻塞程序的运行,提高程序的性能和效率。另外,回调函数还可以实现代码的复用,因为它们可以被多个地方调用。
回调函数的使用场景包括:
- 事件处理:回调函数可以用于处理各种事件,例如鼠标点击、键盘输入、网络请求等。
- 异步操作:回调函数可以用于异步操作,例如读取文件、发送邮件、下载文件等。
- 数据处理:回调函数可以用于处理数据,例如对数组进行排序、过滤、映射等。
- 插件开发:回调函数可以用于开发插件,例如 WordPress 插件、jQuery 插件等。
- 回调函数是一种非常灵活和强大的编程技术,可以让我们更好地处理各种异步操作和事件。
4、Javascript 回调地狱
当多个异步函数一个接一个地执行时,会产生回调地狱。它也被称为厄运金字塔。
代码变得更加难以理解,以及难以维护和修改。这是由回调函数的嵌套而引发的。
var p_client = new Db('integration_tests_20', new Server("127.0.0.1", 27017, {}), {'pk':CustomPKFactory});
p_client.open(function(err, p_client) {
p_client.dropDatabase(function(err, done) {
p_client.createCollection('test_custom_key', function(err, collection) {
collection.insert({'a':1}, function(err, docs) {
collection.find({'_id':new ObjectID("aaaaaaaaaaaa")}, function(err, cursor) {
cursor.toArray(function(err, items) {
test.assertEquals(1, items.length);
// Let's close the db
p_client.close();
});
});
});
});
});
});
5、 如何避免回调地狱?
- 使用promise
- 借助 async-await
- 使用 async.js 库
6、优点和使用场景
用一句话概括:在直接调用函数A()时,把另一个函数B()作为参数,传入函数A()里面,以此来通过函数A()间接调用函数B()。
优点
-
DRY,避免重复代码
-
可以将通用的逻辑抽象
-
加强代码可维护性
-
加强代码可读性
-
分离专职的函数
使用场景
- 异步执行(例如读文件,发送HTTP请求)
- 事件监听和处理
- 设置超时和时间间隔的方法
- 通用化:代码简洁
根据以下文章适当添加描述编写
原文地址:https://juejin.cn/post/6985748641365360648