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

33人阅读 评论(0) 收藏 举报

          想对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引擎空闲的时候就会执行该任务。

查看评论

从单线程到多线程

进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。而进程则...
  • vbanglev
  • vbanglev
  • 2007-02-07 16:02:00
  • 2053

浏览器多线程和js单线程

0.前言开发过程中遇到js线程和ui渲染线程互斥问题。导致ui无法正常更新等问题。这些问题的根源就是因为浏览器的多线程和js的单线程引起的。看本篇博客之前,应该充分理解消息队列,事件循环,同步异步任务...
  • github_34514750
  • github_34514750
  • 2017-08-02 15:13:11
  • 1431

JavaScript单线程异步的背后——事件循环机制

感觉这篇文章拖了很久,好尴尬的拖延症。刚接触前端的时候,知识面是支离破碎的,甚至我都不知道我不知道的,比如事件。现在,慢慢的,我知道我不知道的,比如事件循环机制。然后花时间去了解,就变成我知道我知道的...
  • fen747042796
  • fen747042796
  • 2017-05-16 21:08:44
  • 538

理解javascript异步机制(setTimeout )

最近在学nodejs ,对于异步的概念早就理解了,但是,却有一个问题一直不解。 问题描述: javascript是一个单线程的语言,那他是如何实现异步的呢? 看了很多资料,终于找...
  • zhouyongwinner
  • zhouyongwinner
  • 2014-12-26 17:19:06
  • 2151

JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序

一、浏览器的内核是多线程的,它们在内核制控下相互配合以保持同步,一个浏览器至少实现三个常驻线程:javascript引擎线程,GUI渲染线程,浏览器事件触发线程。 1. javascript引擎...
  • fivedoumi
  • fivedoumi
  • 2015-07-17 15:58:08
  • 1689

Javascript是单线程的深入分析

面试的时候发现99%的童鞋不理解为什么JavaScript是单线程的却能让AJAX异步发送和回调请求,还有setTimeout也看起来像是多线程的?还有non-blocking IO, event l...
  • talking12391239
  • talking12391239
  • 2014-03-13 14:02:19
  • 22572

理解js单线程异步机制

1.最近在维护一个项目,用到的主要语言是JS。因此在写需求功能时对JS的异步有了进一步的理解。JS是单线程的,但是JS是可以异步的。setTimeout(function(){console.log(...
  • content6
  • content6
  • 2018-01-18 16:14:02
  • 67

细说JavaScript单线程的一些事

首先,说下为什么 JavaScript 是单线程? 总所周知,JavaScript是以单线程的方式运行的。说到线程就自然联想到进程。那它们有什么联系呢? 进程和线程都是操作系统的概念。进程是应用...
  • u013510614
  • u013510614
  • 2016-07-17 08:33:55
  • 799

多线程同步与单线程异步对比

阻塞与线程
  • q277055799
  • q277055799
  • 2014-03-03 14:06:17
  • 4729

从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理

最近发现有不少介绍JS单线程运行机制的文章,但是发现很多都仅仅是介绍某一部分的知识,而且各个地方的说法还不统一,容易造成困惑。 因此准备梳理这块知识点,结合已有的认知,基于网上的大量参考资料, 从浏览...
  • vM199zkg3Y7150u5
  • vM199zkg3Y7150u5
  • 2018-01-23 00:00:00
  • 205
    个人资料
    等级:
    访问量: 0
    积分: 42
    排名: 0