进程process: 电脑端安装不少的应用软件,每当运行一个应用程序,至关于开辟一个进程(而对于浏览器来讲,每新建一个页卡访问一个页面,都是新开辟一个进程)web
线程thread: 每个进程中可能还会同时作不少事情,若是程序中须要同时处理不少事情,则须要开辟多个线程(一个线程同时只能作一个事情)编程
=> 一个进程中,会包含0~多个线程promise
理解:浏览器
浏览器是‘多线程’的,可是JS渲染或者页面渲染是‘单线程’的多线程
浏览器是多线程的(打开一个页面之后,浏览器至少要分配好几个线程同时去处理事情),可是浏览器只会分配出一个线程去渲染代码(GUI渲染线程),因此说JS是单线程的:‘在JS代码执行过程当中,一次只能处理一个事情’异步
通俗的理解:好比咱们在食堂打饭这个场景: 咱们在排队打饭,可是当排到B打饭的时候,他的王者荣耀游戏尚未打完(吃饭不积极,思想...😅)async
返回值:是一个数字,表明当前是第几个定时器编辑器
=> 遇到定时器不是不处理,而是把它放在任务队列,等到主线程空闲下来,再去任务队列查看,这种操做是异步。中途定时器到达时间了,可是主线程并无到达时间,此时也不会当即执行定时器,必须等到主线程空闲下来。异步编程
let n = 0;
setTimeout(() => { n++; console.log(n); //=> 3 (2) }, 1000); //一秒钟以后执行 n += 2; console.log(n); //=> 2 (1) 复制代码
let n = 0;
setTimeout(() => { n++; console.log(n); //=> 3 (2) },0); //写零也不是当即执行,而是有一个最小的等待时间:10ms左右 n += 2; console.log(n); //=> 2 (1) 复制代码
let n = 10;
setTimeout(() => { n++; console.log(n); //=>11(3) }, 0); console.log(n); //=>10(1) for(let i = 0;i < 99999999; i++){} console.log(n); //=>10(2) 复制代码
time / timeEnd:获取他们中间代码执行所须要的时间(这个时间须要受到电脑配置、和当前电脑运行的环境等多方面因素影响),时间只做为参考函数
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); 复制代码
console.log(1); //=>1(1)
setTimeout(function () { console.log(2); }, 20); console.log(3); //=>3(2) for (let i = 0; i > -1; i++) {} //=>死循环,GUI线程啥都作不了,一直在这加载(其它什么事情都干不了) console.log(4); setTimeout(function () { console.log(5); }, 10); console.log(6); 复制代码
定义:JS是单线程的,由于浏览器只分配一个线程自上而下加载代码。因此JS中大部分任务都是同步任务。可是必定也有异步任务,定时器、事件绑定等这些都属于异步任务。
而浏览器处理JS中的异步任务是:在JS代码自上而下执行的时候,代码进栈执行,执行完出栈,在这反反复复进行的过程当中。当遇到定时器等异步任务的时候,会把当前任务放在等待任务队列(Event Queue)中存起来,而且存起来以后不会影响下面代码的执行,主线程会继续执行。当 把下面的同步任务执行完成以后,主线程空闲下来了会去等待队列找哪个任务到达指定的时间点,就拿到主线程中去执行。执行完以后再去等待队列中查看...