想对callback一探究竟源于一次对输入的中文校验:

从callback到js单线程到异步机制再到浏览器多线程的浅析篇(上)

         从上面图中可以发现,callback作为校验函数validator的一个参数,这时候就困惑了,咦,callback难道不是回调函数吗?还可以作为函数的形式参数,那,这个validator是?这里面的参数是谁传过来的呢,如果values和rule中的某几个参数是通过外界的输入来控制的,那callback呢?接下来,我们再看看打印出来的日志:

从callback到js单线程到异步机制再到浏览器多线程的浅析篇(上)

         从日志中可以看出,我们姑且可以理解为此时的callback作为validator的固有属性,可以借用java中构造函数的思想理解为validator对象的构造方法的默认属性。

          下面我们对回调函数到底是什么来做下分析:

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

         上面是谷歌对callback做出的解释。我觉得比起被翻译来的中文更好理解。

         ajax请求中的回调

                      从callback到js单线程到异步机制再到浏览器多线程的浅析篇(上)           

异步请求的回调函数

                      从callback到js单线程到异步机制再到浏览器多线程的浅析篇(上)

点击事件的回调函数

                      从callback到js单线程到异步机制再到浏览器多线程的浅析篇(上)

数组中遍历每一项调用的回调函数

                      从callback到js单线程到异步机制再到浏览器多线程的浅析篇(上)

同步回调函数

                      从callback到js单线程到异步机制再到浏览器多线程的浅析篇(上)

       所以从上面的例子中可以总结一下:回调就是它的字面解释,就是这个函数的返回值,再理解一下说白了就是return。下面从js是单线程的来思考回调函数。

       我们都知道,js是单线程的(JavaScript单线程机制也是迫不得已,假设有多个线程,同时修改某个dom元素,那么到底是听哪个线程的呢?),这种设计模式给我们带来了很多不便之处,我们不需要去考虑各个线程之间的通信,因为js的引擎只能一件一件事的去完成和执行相关的操作,所以所有需要执行的请求都需要排队,等待着被执行。这时,我们就会想到,实际项目中,如果有个请求执行要花很长时间,那么后面的任务都需要等待吗,严重时,会给用户一种浏览器崩溃了卡了的假死感受。更有甚者,正在执行一个是循坏,哈哈哈。。。所以,为了解决这个问题,js在同步机制的缺陷下设计出了异步模式。(当然前面说后面的任务如果都是主线程上的任务,即没有回调函数,那么只能卡死)

        在异步模式下,每一个异步任务都有一个或者多个回调函数,假如:一个异步任务有多项子任务,在第一个任务完成之后,不会马上去执行下一个任务,而是执行它的回调函数,而下一个任务也不会等待当前这个回调函数执行完,因为它也不能确定当前的回调何时执行完,只要这个任务被触发就会执行。(所以,我们可以理解为js是单线程但是有同步和异步机制)

       举个例子:我们在淘宝上购物,当我们点击进入商品详情页后,图片资源还为加载完成,而此时我发起了另一个请求加入购物车,此时,我们会发现,加入购物车的事件开始执行,但是这个执行不会影响到剩下的图片的额加载请求。这就是异步模式的妙用之处。

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

       说道js的单线程,顺便再了解一下关于浏览器内核的多线程,关于浏览器工作原理暂且分析,浏览器常驻三大线程:js引擎线程,GUI渲染线程,浏览器事件触发线程

       从callback到js单线程到异步机制再到浏览器多线程的浅析篇(上)

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

相关文章:

  • 2022-12-23
  • 2021-06-11
  • 2022-12-23
  • 2022-01-09
  • 2021-08-01
  • 2022-12-23
  • 2021-08-02
  • 2021-06-30
猜你喜欢
  • 2021-12-30
  • 2022-12-23
  • 2021-05-09
相关资源
相似解决方案