浅谈 JavaScript 您所在的位置:网站首页 回调函数用法怎么理解 浅谈 JavaScript

浅谈 JavaScript

2023-12-04 02:14| 来源: 网络整理| 查看: 265

在MDN的文档中,对callback()的定义为:

被作为实参传入另一函数,并在该外部函数内被调用,用以来完成某些任务的函数,称为回调函数。

A callback is a function that is passed as an argument to another function and is executed after its parent function has completed.

1. 理解回调函数

调用过程:函数a的参数为函数b,当函数a执行完之后再去执行b

或许,可以通俗地认为:做完函数a的事情,再去做函数b的事情

再打个比方:

你去上学,妈妈送你去上学并叮嘱你要记得将缴费单交给老师。

此时,函数a为妈妈送你上学,函数b为你将缴费单交给老师。也就是你要做完函数a,才会去执行函数b。

提个疑问:

Q:为什么不直接把整个事情在函数a中写好,而是要通过一个参数进行回调呢?

A:如果你直接写进去,function a(){...;b();},那就直接写死了,失去了变量的灵活性。当你要传入别的函数时,需要重新写一遍函数a。

2. 代码展示 function a(callback) { console.log("parent函数a!"); console.log("调用回调函数"); callback(); // 调用回调函数 } function b(){ console.log("回调函数b"); } function c() { console.log("回调函数c"); } function test(){ a(b); a(c); } test(); 3. 为什么需要回调

JavaScript 在浏览器中运行,浏览器的主进程是单线程事件循环。如果我们尝试在单线程事件循环中,执行长时间运行的操作,则会阻止该过程。

JavaScript 是按从上到下的顺序运行代码。在有些情况下,必须在某些情况发生之后,代码才能运行,这就不是按顺序运行了。这是异步编程。

回调函数确保:函数在某个任务完成之前不运行,在任务完成之后立即运行。它帮助我们编写异步 JavaScript 代码,避免问题和错误。

在 JavaScript 里创建回调函数的方法是:将它作为参数传递给另一个函数,然后当某个任务完成之后,立即调用它。

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请求) 事件监听和处理 设置超时和时间间隔的方法 通用化:代码简洁

一篇关于callback()的好文:《从零起步,真正理解Javascript回调函数》



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有