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对象