单线程、同步和异步、回调函数

1,单线程

  java是多线程语言,js是单线程的语言,单线程意味着,如果同时有多个任务,这些任务需要进行排队,前一个任务执行完,才会执行下一个任务

2,js为什么是单线程?

  与用途有很大的关系,js作为浏览器的脚本语言,主要实现与用户的交互,可以实现对DOM的各种操作,如果是多线程,一个增加内容,一个删除内容,那么这个DOM是添加还是删除,会带来很复杂的同步问题,所以是单线程

3,为什么有同步任务和异步任务?

  因为js的单线程语言,需要排队,有些文档浏览或者接口请求,执行时间比较长,影响用户体验。

  主线程完全不用等文件读取完毕或者ajax加载成功,可以先挂起处于等待的任务,先运行排在后边的任务,等文件读取成功或者ajax有了结果,再之情挂起任务,因此任务分为同步任务和异步任务

4,什么是同步和异步

  同步:主线程上的排队任务,只有一个执行完毕才会执行下一个任务(比如,网站渲染,元素渲染)

  异步:不进入主线程而进入任务队列,只有任务队列通过主线程,某个任务可以执行了,才会进入主线程(图片加载,音乐加载)

5,异步机制?

  任务队列是个先进先出的数据结构,也是一个事件队列

  例如,文章读取也是一个异步,会添加到任务队列中,IO完成后,任务队列中会添加一个事件,表示异步完成,可进入执行栈,这时候主线程不一定有空,当主线程处理完其他任务,有空的时候就会读取任务队列,排在前面的优先处理,如果这个任务注定了回调函数,那么主线程在处理事件的时候,就会执行回调函数的代码,也就是执行异步任务

  任务循环:单线程从任务队列中读取任务是不断循环的,每次栈被清空后,都会在任务队列中读取新的任务,如果没有任务,就会等到有新任务

  事件循环:每个任务都是由一个任务触发的

6,异步机制步骤?

  (1)所有同步任务都在主线程执行,行程一个执行栈

  (2)主线程之外还存在一个任务队列,只要异步任务有了结果,就会在任务队列中防治一个事件

  (3)一旦执行占中的所有同步任务执行完毕,系统就会读取任务队列,看看里边还有哪些事件,哪些对应的异步任务,于是结束等待状态,进入执行栈,开始执行

  (4)主线程不断地重复上边的第三步

7,异步编程(需要等待但是又不能阻塞程序的时候用异步)?

  (1)回调函数(等待着被调用,先定义好函数使用时调用):作为参数传递给另一个函数,然后通过外部函数内部调用该函数,以完成某种操作

    在另一个函数完成执行后立即执行,作为参数传递给另一个函数的函数,这个回调函数会在传给的函数内部执行

    为什么使用回调?为了阻塞长时间运行的操作

  (2)事件监听

  (3)Promise对象   

原文地址:https://www.cnblogs.com/xiaohaha668/p/12975059.html