什么是单线程?同步、异步的产生?
JS属于单线程,虽然存在webworker(创造多线程环境,允许主线程创建线程,将一些任务分配给后者运行),但是webworker也只能进行一些计算任务,不能直接操作DOM。
这是为什么呢?这是因为在浏览器的实际运行中,不能存在同时多个线程操作DOM的现象。比如说,线程a增加DOM,线程b删除DOM。这样页面的绘制就混乱了,所以说需要串行执行。
异步的产生
单线程及任务串行执行,后一个任务需要等待前一个执行完毕方可执行,在这个过程中就出现了等待时间。
但是在ajax网络请求、setTimeout、DOM事件的用户交互(如addEventListener)等,这些任务的执行只是长时间的空等,而并不消耗CPU,因此产生了异步。
这也是推崇js异步的优势之一,我们可以将不相连的分支功能交给对应的异步中处理,这样主线程的效率将大大提升,可以并行去处理其他的功能操作。
异步是主线程cpu跳过任务等待,先处理任务顺序中后续任务。
同步的利用
当异步完后,主线程结束掉了上一个任务处于空闲时,主线程此时会读取相应的callback回调,执行回调中的事件,最大程度的使用cpu,此时便是同步。
同步是主线程按照任务顺序,串行执行任务。