JavaScript 的执行机制指的是 JavaScript 代码在运行时的工作方式和顺序。它涉及以下几个关键概念:
需要注意的是,JavaScript 中的异步任务通常是通过回调函数、Promise、async/await 等机制来处理。通过合理使用异步任务和任务队列,可以实现非阻塞的代码执行,提高代码的性能和响应能力。JavaScript 的执行机制主要涉及以下几个概念:调用栈、事件循环和任务队列。文字有点单调,看看下面的图理解理解 让我们通过一个例子来解释这些概念。假设我们有以下代码:
console.log("Script start");
setTimeout(function() {
console.log("setTimeout");
}, 0);
Promise.resolve().then(function() {
console.log("Promise");
});
console.log("Script end");
这段代码的执行机制如下:
console.log("Script start")
,它会立即打印 "Script start"。setTimeout
,它是一个异步函数,会被放入任务队列中,并设置一个定时器。由于定时器时间为 0,所以不会立即执行。Promise.resolve().then()
,它会创建一个 Promise 对象,并将 .then()
中的回调函数放入微任务队列中。Promise
的回调函数,打印 "Promise"。setTimeout
的回调函数被放入任务队列中。综上所述,JavaScript 的执行机制遵循以下步骤:
需要注意的是,微任务优先级高于任务队列中的任务,所以在执行任务队列中的任务之前,会先执行完所有的微任务。
现学现用,再看一个例子:
async function async1() {
console.log("async1 start");
await async2();
console.log("async1 end");
}
async function async2() {
console.log("async2");
}
console.log("js start");
setTimeout(function () {
console.log("timeout");
}, 0);
async1();
new Promise(function (resolve) {
console.log("promise");
resolve();
}).then(function () {
console.log("then");
});
console.log("js end");
这段代码的打印顺序如下:
async1
函数被调用,所以会打印 "async1 start"。async1
函数中调用了 async2
函数,因此会打印 "async2"。new Promise
的回调函数立即执行,所以会打印 "promise"。async2
函数是一个异步函数,await async2()
表达式会等待 async2
函数执行完毕,然后继续执行下面的代码,所以会打印 "async1 end"。Promise
的 then
方法是异步执行的,所以会在下一个事件循环中执行,因此会打印 "then"。setTimeout
的延迟时间为 0,所以会在下一个事件循环中执行,因此会打印 "timeout"。代码的执行顺序是按照同步代码的顺序执行,异步代码则根据事件循环的机制来执行。async/await
会暂停同步代码的执行,并等待异步操作完成后再继续执行后续的代码。JS 代码的执行顺序主要为:
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8