js是单线程的
所谓"单线程",就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。
js最大的特点就是单线程的
为什么js是单线程?
JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。
JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?
所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。
同步异步
所有的任务分为两种:
一种是同步任务(synchronous)
另一种是异步任务(asynchronous)
同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
(把耗时的放在一边,等同步任务的都执行完之后,执行异步任务)
异步任务有哪些:定时函数setTimeout和setInterval; DOM事件绑定; Ajax操作; NodeJS中的fs文件读写 等。
异步案例:
console.log('0');
setTimeout(function(){
console.log('1');
},1000)
setTimeout(function(){
console.log('2');
},500)
setTimeout(function(){
console.log('3');
},0)
console.log('4');
此时的setTimeout(),就是一个异步任务 。
先放进任务队列中,等同步代码执行完毕,再来执行他。
执行结果顺序为:0 4 3 2 1
js为什么需要异步那
如果JS中不存在异步,只能自上而下执行,万一上一行解析时间很长,那么下面的代码就 会被阻塞。
对于用户而言,阻塞就意味着"卡死",这样就导致了很差的用户体验。
js单线程又是如何实现异步的呢?
通过事件循环(event loop)实现'异步'。
异步任务有哪些呢?
定时函数setTimeout和setInterval; DOM事件绑定; Ajax操作; NodeJS中的fs文件读写 等。
Event Loop 事件循环
只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会不断重复