这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战
一、JavaScript
js是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。js采用弱类型的变量类型,是一种基于对象的脚本语言。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。最主要的是它是单线程。
任务队列
线程
这里说下什么是单线程
单线程:指在程序执行时,所有的路径按照连续顺序排下来,前面的必须处理好,后面的才能继续执行 多线程:在程序执行时,多个任务可以同时执行
官方点就是,单线程就是进程中只有一个线程,多线程就是进程中有多个线程。
任务分类
在js的任务中,所有的任务可以分为两种,一种是同步任务,一种是异步任务。
比如
console.log('a')
for(let i = 0; i < 10; i++) {
console.log(i)
}
console.log('b')
上边就是同步任务,先执行a输出,按顺序执行for循环,在for循环执行完之后,再执行输出b
比如:
console.log('a')
setTimeout(()=> {
console.log('c')
},0)
console.log('b')
下边这个异步任务
从结果上我们能看出来,尽管在定时器上的时间为0,在程序的处理上还是先将这个定时器挂起,先将宏任务执行完,才执行挂起的微任务。
异步的执行
- 所有同步任务都在主线程上执行,形成一个执行栈。
- 主线程之外,还有存在有任务对列(task queue)。只要异步任务有了运行结果,就在‘任务队列’中放置一个事件
- 当‘执行栈’中所有的同步任务执行完毕,系统就回读取‘任务队列’,查看还有哪些任务,然后在等待的异步任务就会结束等待状态,进入执行栈,开始执行
- 之后主线程不断的重复上述步骤
如下
Promise.resolve().then(() => {
console.log('promise1');
})
setTimeout(() => {
console.log('setTimeout1')
Promise.resolve().then(() => {
console.log('promise2');
})
}, 0)
setTimeout(() => {
console.log('setTimeout2')
}, 0)
在任务队列的执行结果如下:
未完待续。。。。