首页 > 编程知识 正文

callback函数用法,js回调函数执行顺序

时间:2023-05-04 21:40:22 阅读:39560 作者:4999

前言

其实,我一直对js里的卡拉巴克很困惑。 困惑的原因是学习中这份资料很少,但平时经常看到。 偶尔复制前人的代码,即使功能实现也不追究其原因。 那样的话,这个callback的概念就会越来越混乱。 因为你总是觉得那是在你的Ajax请求后调用的函数。 另外,因为我觉得那是你在某个函数中的形式。有一天,kadds看了一点关于Node.js的代码后,你会更加崩溃。 因为你会找到很多卡拉巴克。 但是,这样下去绝对不行。 因为很多东西只是知道概念和理论,而没有实践结果。 因为我没有思考和感觉。 这些东西永远不是你的。 所以,凡是用于技术的东西都要花时间钻研。 花点时间实践也能明白,很多思想会沉淀,所以最近浏览了相关的文章和资料。 我也在项目中实践了一些事情。 这样绕了一圈,会很明亮

一.分清异步和同步

异步同步/同步同步

举个小栗子

1 .早上起床后,无论是刷牙还是洗脸,一件事做完后再进行下一步就是同期的例子

2 .然后刷牙的时候也可以烧水喝。 (不必等着刷牙)这是一个异步的例子

段异步代码示例

js中最基础的异步实现

执行结果

上面的代码先执行函数a。 然后,在a中的延迟函数执行之前不执行函数b。 在触发延迟函数时执行函数b,并在js引擎事件队列空闲时执行队列中等待的setTimeout回调函数。 这就是异步的例子

闲话:

调用setTimeout函数会在一段时间后将消息添加到队列中。 此期间作为函数的第二个参数传递。 如果队列中没有其他消息,则会立即处理该消息。 但是,如果有其他消息,则setTimeout消息必须等待处理其他消息。 因此,第二个参数表示最少的时间,而不是精确的时间

因此,即使将时间设定为0,函数b也同样先执行

段同步代码示例

结果输出1

因为print函数在change函数完成后执行,所以结构的输出为1。 change函数是在更改全局变量a的值并执行change函数之后执行的打印函数

2 .回调函数是什么

acallbackisafunctionthatispassedasanargumenttoanotherfunctionandisexecutedafteritsparentfunctionhascompleted。

以上说明是谷歌给出的说明,非常清晰简洁,有时我觉得英语理解比翻译成中文二次理解更清楚

看看一些经典的回调函数代码。 我保证你一定用过他们

异步请求的回调函数

单击事件的回调函数

遍历数组中的每个回调函数

同步回调示例

因此,回调与同步、异步没有直接关联。 回调只是一种实现方法,既有同步回调,也有异步回调,还有事件处理回调和延迟函数回调。 这些在我们的工作中有很多使用场景

所以不是我们不知道回调函数,而是我们漂浮在这个“callback”字上面。 kadds在函数中看到它会很困惑,其实只是形参名

3 .写回调函数的理由

看了以上的简单介绍之后,是不是对callback不再了解,不再感到神秘了? 所以,尽情地使用吧。

1 .关于回调函数和js单线程和js异步机制

我们知道js是单线程的。 这种设计模式给我们带来了很多便利。 我们不需要考虑各线程之间的通信,也不需要写很多烧脑的代码。 也就是说,js的引擎只能做一件一件的事情,所以所有需要执行的事情都在排队等待被触发执行。 但是那样的话,如果队列中有一件事,就会花很多时间。 之后的任务可能会处于等待状态,浏览器可能会处于假死状态。 例如,js在同步机制的缺陷下设计了异步模式,因为如果其中一个正在运行的任务处于死循环,后续的其他任务将无法正常执行

在异步执行模式下,每个异步任务都有自己的一个或多个回调函数。 因此,当前正在运行的异步任务执行后,将执行其回调函数,而不是立即执行事件队列中的下一个任务,下一个任务也不会等待当前回调函数执行。 为什么这么说,是因为不知道当前的回调是否顺利执行。 如果被触发,就会执行。 举个例子,

尚未请求图像资源

从上面的照片可以看出,我想买点什么。 单击项目详细信息页面后,尚未请求图像资源。 到时候,我可以点击add to cart开始另一个请求。 将执行js任务列表中的购物车添加事件,其执行不会干扰图像

资源的请求任务,这也是异步执行机制的妙处

2.js的单线程浏览器内核的多线程

说到js的单线程,顺便再了解一下关于浏览器内核的多线程,关于浏览器工作原理此处不做讲解,因为自己研究的不深入,等待研究学习研究透彻再分享

cayley的草图

浏览器常驻三大线程: js引擎线程,GUI渲染线程,浏览器事件触发线程

看到此图你是不是会豁然开朗许多,因为浏览器是一个多线程的执行环境,在浏览器的内核中分配了多个线程,最主要的线程之一即是js引擎的线程,同时js事件队列中的异步请求,交互事件触发,定时器等事件都是由浏览器的事件触发线程进行监听的,浏览器的事件触发线程被触发后会把任务加入到js 引擎的任务队列中,当js 引擎空闲时候就会开始执行该任务

完结

以上就是本篇文章的全部内容,由对回调函数的陌生到熟悉和使用,以及对同步/异步的概念,还有js的执行机制以及浏览器内核的多线程机制相信大家都有了一个简单的知识脉络,希望通过此文提到的内容,每个小伙伴去查阅更深入的资料,于此同时我也会不断的去修缮,所以我们不能做一个知其然而不知其所以然的程序员,要有充分的好奇心去学习它,带着学习让我们受益的心态去做和研究自己感兴趣的东西是一件非常快乐的事情,希望我可以把我的快乐带给每一位看文章的小伙伴,也希望你多多给我提出意见,让我们一起在学习的路上共同发现和成长,2107年欢迎你和我一起做一个不断努力学习的知识分子

说明:文章中的图片均处于本人截图和绘制,文字均属原创,转载请注明出处

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。