对JavaScript中异步同步机制以及线程深入底层了解
Posted Mrzwq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对JavaScript中异步同步机制以及线程深入底层了解相关的知识,希望对你有一定的参考价值。
今天在网上看到各种对Js异步同步单线程多线程的讨论 经过前辈们的洗礼 加上鄙人小小的理解 就来纸上谈兵一下吧~
Js本身就是单线程的 至于为什么Js是单线程的 那就要追溯到Js的历史了 总而言之 由于Js是浏览器的脚本语言 经常操作dom元素 多线程的话反而会导致更复杂(删除与添加同时进行?)这只是简单的解释了为什么Js要单线程的原因, 为什么Js又能异步执行方法呢? 这特么的不是很矛盾吗!!!
但是,但是注意了 就是因为Js主要是在浏览器中运行的脚本语言 浏览器是典型的GUi工作线程 因为它在绝大多数环境是为实现事件处理,为了避免同步带来的堵塞交互所以它产生了异步的特性(这里还是浏览器的作用和Js本身的主线程没有关系)
Js的单线程在浏览器的同一时刻只有一段代码在执行,而异步机制是浏览器来实现的,由浏览器的两个或者多个常驻线程来共同完成的,而主要任务还是Js的单线程来实现 辅助线程只是另外开辟了一个任务队列 这个任务队列里面会存放所有异步方法执行的结果 ,当Js的主线程栈全部执行完毕以后 它就会去这个任务队列里面去找有没有可执行的任务 如果有就把它插到主线程栈的尾部执行 执行完毕之后然后继续此番循环(Event Loop) 说了这么多概念的东西 不如举个栗子?
常见的异步方法 比如定时器 这个最常用了吧!!
这个例子简单的解释了下异步的执行顺序(异步执行的方法永远排在Js主线程的后面)
打开控制台
console.log(‘我是第一个出现的!!‘)
setTimeout(function(){
console.log(‘我是第三个出现的!!‘)
},0)
console.log(‘我是第二个出现的!!’)
控制台会输出 我是第一个出现的!!
我是第二个出现的!!
我是第三个出现的!!
这是因为定时器在浏览器中有个单独的线程不属于主线程
以上是关于对JavaScript中异步同步机制以及线程深入底层了解的主要内容,如果未能解决你的问题,请参考以下文章