本篇文章给大家介绍一下线程和进程,了解一下JavaScript中的执行上下文和执行机制,希望对大家有所帮助!
|
本篇文章给大家介绍一下线程和进程,了解一下JavaScript中的执行上下文和执行机制,希望对大家有所帮助!
关于 线程和进程说 什么是线程用官方的话术来说 什么是进程用官方的话术来说 线程和进程的关系
一个 一个 下面笔者举一个简单的例子,比如我们打开 进程之间相互独立,但同一进程下的各个线程间有些资源是共享的。 线程的生命周期线程的生命周期会经历五个阶段。
js是单线程还是多线程呢
执行上下文和执行栈什么是执行上下文当 执行上下文分类
什么是执行栈?前面我们说到 栈是一种先进后出的数据结构。
所以总结来说用来存储代码运行时创建的执行上下文就是执行栈。 js执行流程在执行一段代码时, 然后 如果这段代码中存在 当一个执行栈执行完毕后该执行上下文就会从栈中弹出,接下来会进入下一个执行上下文。 下面笔者来举个例子,假如在我们的程序中有如下代码 console.log("Global Execution Context start");
function first() {
console.log("first function");
second();
console.log("Again first function");
}
function second() {
console.log("second function");
}
first();
console.log("Global Execution Context end");上面的例子我们简单来分析下
我们用一张图来总结
好了。说完执行上下文和执行栈我们再来说说 执行机制说到 同步任务和异步任务在 同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。 异步任务指的是,不进入主线程、而进入"任务队列"的任务(任务队列中的任务与主线程并列执行),只有当主线程空闲了并且"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。由于是队列存储所以满足先进先出规则。常见的异步任务有我们的 事件循环前面介绍了同步任务和异步任务,下面我们来说说事件循环。
上述过程会不断重复,也就是常说的 Event Loop(事件循环)。 我们用一张图来总结下
下面笔者简单来介绍个例子 function test1() {
console.log("log1");
setTimeout(() => {
console.log("setTimeout 1000");
}, 1000);
setTimeout(() => {
console.log("setTimeout 100");
}, 100);
console.log("log2");
}
test1(); // log1、log2、setTimeout 100、setTimeout 1000
上面的例子比较简单,相信只要你看懂了上面笔者说的同步异步任务做出来是没什么问题的。那下面笔者再举一个例子小伙伴们看看会输出啥呢? function test2() {
console.log("log1");
setTimeout(() => {
console.log("setTimeout 1000");
}, 1000);
setTimeout(() => {
console.log("setTimeout 100");
}, 100);
new Promise((resolve, reject) => {
console.log("new promise");
resolve();
}).then(() => {
console.log("promise.then");
});
console.log("log2");
}
test2();要解决上面的问题光知道同步和异步任务是不够的,我们还得知道宏任务和微任务。 宏任务和微任务在 常见的宏任务
常见的微任务
所以在上面的例子中就涉及到宏任务和微任务了,那宏任务微任务的执行顺序是怎么样的呢?
我们用一张图来总结下
读懂了异步里面的宏任务和微任务上面的例子我们就可以轻易的得到答案了。
所以test2方法执行后会依次输出
正所谓百看不如一练,下面笔者举两个例子如果你都能做对那你算是掌握了 例子1 function test3() {
console.log(1);
setTimeout(function () {
console.log(2);
new Promise(function (resolve) {
console.log(3);
resolve();
}).then(function () {
console.log(4);
});
console.log(5);
}, 1000);
new Promise(function (resolve) {
console.log(6);
resolve();
}).then(function () {
console.log(7);
setTimeout(function () {
console.log(8);
});
});
setTimeout(function () {
console.log(9);
new Promise(function (resolve) {
console.log(10);
resolve();
}).then(function () {
console.log(11);
});
}, 100);
console.log(12);
}
test3();我们来具体分析下
所以上面代码例子会依次输出 例子2 我们把上面的例子1稍作修改,引入 async function test4() {
console.log(1);
setTimeout(function () {
console.log(2);
new Promise(function (resolve) {
console.log(3);
resolve();
}).then(function () {
console.log(4);
});
console.log(5);
}, 1000);
new Promise(function (resolve) {
console.log(6);
resolve();
}).then(function () {
console.log(7);
setTimeout(function () {
console.log(8);
});
});
const result = await async1();
console.log(result);
setTimeout(function () {
console.log(9);
new Promise(function (resolve) {
console.log(10);
resolve();
}).then(function () {
console.log(11);
});
}, 100);
console.log(12);
}
async function async1() {
console.log(13)
return Promise.resolve("Promise.resolve");
}
test4();上面这里例子会输出什么呢?这里我们弄懂 我们知道 function test4() {
console.log(1);
setTimeout(function () {
console.log(2);
new Promise(function (resolve) {
console.log(3);
resolve();
}).then(function () {
console.log(4);
});
console.log(5);
}, 1000);
new Promise(function (resolve) {
console.log(6);
resolve();
}).then(function () {
console.log(7);
setTimeout(function () {
console.log(8);
});
});
new Promise(function (resolve) {
console.log(13);
return resolve("Promise.resolve");
}).then((result) => {
console.log(result);
setTimeout(function () {
console.log(9);
new Promise(function (resolve) {
console.log(10);
resolve();
}).then(function () {
console.log(11);
});
}, 100);
console.log(12);
});
}
test4();看到上面的代码是不是就能轻易得出结果呢?
所以上面代码例子会依次输出 扩展setTimeout(fn, 0)关于
我们知道js分同步任务和异步任务, 笔者这里再提一嘴,你觉得我们在 function test5() {
setTimeout(function () {
console.log("setTimeout");
}, 100);
let i = 0;
while (true) {
i++;
}
}
test5();上面的例子一定会在 GUI渲染
由于 所以宏任务、微任务、GUI渲染之间的关系如下 宏任务 -> 微任务 -> GUI渲染 -> 宏任务 -> ... 【相关视频教程推荐:web前端】 以上就是深入浅析JavaScript中的执行上下文和执行机制的详细内容,更多请关注模板之家(www.mb5.com.cn)其它相关文章! |
