携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
大家好!我是前端爬楼工程师🚹,一个野生程序员。好奇新技术,仰慕牛大佬。如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~
异步编程指的是程序中的一部分现在运行,另一部分在将来运行,现在和将来之间有段间隙,在这段间隙中,程序没用活跃。
异步控制台
console.*方法族不是Javascript的一部分,而是由宿主环境添加到Javascript中的。console.log有时候并不会将传输内容立即输出。因为console.log属于I/O,有时候浏览器为了提高性能,后台会异步处理它。
var a = {index:1}
console.log(a) // 不一定是{index:1}
a.index++
事件循环
JavaScript引擎得依靠宿主环境运行,环境提供了一种机制来执行每块代码,这种机制叫事件循环。
JavaScript没有时间概念,settimeout并没有把你的回调函数挂在事件循环队列中,它所做的就是一个定时器,当到设定的事件后,才把回调函数放到事件循环中,在未来某个时刻tick执行这个回调。所以当事件循环队列排的比较满时候,你的回调就会等待,他得排到其他项的后面,这是settimeout精度不高的原因。
循环队列里通常还会有和你程序不相关的其他事件。
并行线程
异步是现在和将来的时间间隙,并行则是能够同时发生的事情。
并行计算最常见的工具是进程和线程。
完整运行
var a = 1
var b = 2
function foo(){
a++
b = b*a
a = b+3
}
function bar(){
b--
a = 8 +b
b = a* 2
}
ajax("", foo)
ajax("", bar)
JavaScript是单线程的,foo()和bar()中的代码具有原子性。一旦foo()开始执行,它的所有代码都会在bar()中的任意代码运行之前完成,反之亦然。这称为完整运行特性。
foo和bar是将来运行的,有可能执行顺序不一样,导致a和b的最终结果也会不一样,这种函数不确定性就是竟态条件。