js执行上下文
执行上下文就是一个解析和执行JavaScript代码的环境的抽象概念。通俗地说,就是每当运行JavaScript代码的时候,就在执行上下文环境中运行的。
在JavaScript中执行上下文的三种分类:
1.全局执行上下文:这是默认或者说是最基础的执行上下文,一个程序中只会存在一个全局上下文,会位于执行堆栈的最底部,全局上下文会生成一个全局对象,并且将this绑定在全局对象window上
2.函数执行上下文:每当一个函数被调用的时候,都会重新创建一个新的函数执行上下文。
3.Eval函数执行上下文:执行在eval函数内部的代码也会有它属于自己的执行上下文。
执行栈
运行js代码的时候会创建执行上下文,但是执行上下文是需要存储的,它就是栈数据结构。所以用来存储代码运行创建的执行上下文就是执行栈。
执行机制
js中有同步任务和异步任务
1.同步任务:在主线程执行的任务,只有当前一个任务结束后,才会执行后一个任务
2.异步任务:是不进入主线程,而是进入任务队列里边的任务,任务队列中任务也会跟同步任务并列执行,任务队列里边的任务会拿到结果,只有当主线程空闲且任务队列通知主线程,某个任务队列可以执行了,该任务才会进行主线程。先进先出原则。常见的异步任务有:setInterval、setTimeout、promise.then等
事件循环
js是单线程的,因此JavaScript中的所有任务都需要排队依次完成
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();
// 依次输出1、6、13、7、Promise.resolve、12、8、9、10、11、2、3、5、4