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

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


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


         从日志中可以看出,我们姑且可以理解为此时的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请求中的回调

                                 

异步请求的回调函数

                      

点击事件的回调函数

                      

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

                      

同步回调函数

                     

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

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

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

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

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

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

       

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

猜你喜欢

转载自blog.csdn.net/luomanqshijie/article/details/79949905
今日推荐