【JavaScript】JS 的单线程

本文详细解析了JavaScript的单线程特性及其带来的线程阻塞问题。通过实例说明了定时器如何作为异步任务在for循环结束后执行,并介绍了同步任务与异步任务的区别。同时,阐述了回调函数在异步编程中的角色。最后,概述了JS代码的执行顺序,包括同步任务的执行栈和异步任务的任务队列。
摘要由CSDN通过智能技术生成

JS 的单线程

单线程:同一时间只能执行一个任务,只有把上一件事情干完,才能干下一件事情(这会造成线程阻塞

线程阻塞:前面的任务耗时过长,导致后面的代码不能执行

所以,对于事件、ajax 请求、定时器等非常耗时的程序,浏览器会开辟其他线程来处理,我们称这样的程序为异步程序

定时器是异步程序,所以 for 循环已经走完后,才会执行定时器内的语句

for (let i = 0; i < 5; i++) {
    setTimeout(() => {
        console.log(i); // 0 1 2 3 4
    }, 1000);
}

let 定义的变量,具有块级作用域。定时器在该作用域内,只能访问变量 i 指定的值

同步任务 & 异步任务

  1. 同步任务:在 JS 主线程排队执行的任务,形成执行栈 Call Stack
  2. 异步任务:不进入主线程,进入浏览器开辟的新线程 Browser APIs 的任务,形成任务队列 Event Queue

在这里插入图片描述

异步任务只有任务队列通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行

setTimeout(() => {
    console.log(1);
}, 0)
for (let i = 0; i < 10000; i++) {
    console.log(2);
}
// for 循环执行完后,定时器才会执行
回调函数
  • 函数作为参数传递给另一个函数,这个参数函数,就是回调函数
function b(fn) {
    fn()
}

b(function () {
    console.log(1)
})
  • 异步任务一定有回调函数,但有回调函数不一定是异步任务
setTimeout(function () {
    console.log(1);
}, 100);

JS 代码的执行顺序

  1. 所有同步任务都在主线程上,形成一个执行栈 Call Stack
  2. 主线程外,还存在一个任务队列 Event Queue。只要异步任务有了运行结果,就在任务队列中放置一个事件
  3. 执行栈中的同步任务执行完毕后,系统就会读取任务队列
  4. 主线程不断重复上面的第 3 步
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JS.Huang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值