JS中的同步异步编程-微任务-宏任务

浏览器是多线程的
1. GUI渲染线程
2. HTTP网络请求线程(并发数6~7)
3. 事件监听\定时器监听…

JS代码的运行是单线程的:浏览器只分配一个GUI渲染线程去执行我们的JS代码
1. 对于大部分JS代码来讲上面代码没有执行完,下面代码是不能执行的 “同步编程”
2. 但是对于某些JS代码来讲(事件绑定、定时器、Promise/async/await、Ajax等),我们需要在上面代码没有处理的情况下,GUI渲染线程能够继续向下执行 “异步编程”

console.time('AAA');
//...执行的代码
console.timeEnd('AAA');
//time/timeEnd可以记录一段程序执行的时间(时间受电脑性能和执行时候的环境状态的影响)“事后统计法“ 200ms-400ms

一、理解JS的同步和异步

题目一

 console.log(1);
setTimeout(() => {
 console.log(2);
}, 1000);
console.log(3);
setTimeout(() => {
    console.log(4);
}, 0);
console.log(5);
for (let i = 0; i < 99999999; i++) {
    // do soming
    if(i===99999998){
   		 console.log(6);
    }
}
console.log(7);

答案:13567 42
在这里插入图片描述

setTimeout(() => {
    console.log(1);
}, 20);
console.log(2);
setTimeout(() => {
    console.log(3);
}, 10);
console.log(4);
console.time('AA');
for (let i = 0; i < 90000000; i++) {
    // do soming
}
console.timeEnd('AA'); //=>AA: 79ms 左右
console.log(5);
setTimeout(() => {
    console.log(6);
}, 8);
console.log(7);
setTimeout(() => {
    console.log(8);
}, 15);
console.log(9);

答案:24579 3168
输出24579是同步的,3168是异步的
在这里插入图片描述


二、理解宏任务和微任务

async function async1() {
    console.log('async1 start');
    await async2();
    console.log('async1 end');
}
async function async2() {
    console.log('async2');
}
console.log('script start');
setTimeout(function() {
    console.log('setTimeout');
}, 0)
async1();
new Promise(function(resolve) {
    console.log('promise1');
    resolve();
}).then(function() {
    console.log('promise2');
});
console.log('script end');

答案:
script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout
在这里插入图片描述


三、理解JS中的有哪些队列

1、数据结构中的队列:队列和优先级队列
2、浏览器渲染队列(减少DOM的回流和重绘的=>只要遇到修改DOM的统一放到渲染队列中,直到遇到读取样式的,停止往队列里放,将渲染队列中的代码执行,重新渲染刷新页面,再遇到修改DOM的,按以上步骤执行)
3、同步异步编程:任务/事件队列
4、vue/react中关于修改状态的更新也是有队列结构的
【vue】
this.name=‘xxx’;
this.arr=[10,20];

和浏览器渲染队列类似,是等到所有的状态代码都处理好,统一让组件重新渲染一次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值