JavaScript 的一个比较明显的特性就是 单线程
。即 JS 在执行环境中是单线程的,所有任务按顺序执行下去
,后面必须等待前面任务执行完成才能执行。同步任务是按照时间线性排列下去的。如:
console.log(1)
console.log(2)
console.log(3)
console.log(4)
// output
1
2
3
4
JavaScript 单线程
JavaScript 作为一个处理用户交互,界面操作的脚本语言,为降低处理交互逻辑中同步处理逻辑的复杂性,单线程是诞生之初就已经决定的事。
如果多线程同步执行,如用户同时对同一个元素进行修改和删除操作,无法判断以哪一个线程为主。
当然单线程的任务处理效率通常比多线程低,如果完成同步任务的时间过长,可能还会造成应用程序无法响应,对于文档处理之类的应用而言并不友好。
为提高CPU 的利用率,JavaScript 提出了 WebWorker 的概念。允许 JavaScript 主线程创建多个子线程,但是子线程没有 DOM 的操作权限,而且需要通过和主线程通信将消息通知到指定的处理程序,受主线控制。WebWorker 并没有改变 JavasScript 单线程的本质。
JavaScript 单线程不代表执行环境单线程
JS 运行在浏览器环境,JS 执行环境是单线程的,但是浏览器环境并不是单线程的。浏览器环境还包括GUI渲染
,HTTP 请求处理
,事件触发
等等。