如果代码跳过宏任务,回调函数的目的是什么?

What's the purpose of callback function if code skips macrotasks?

最近,我试图理解JavaScript中的回调函数,但是,这个概念离我的理解还很远。我有这样的代码:

function exampleFunc(callback) {
    console.log("Starting...");
    setTimeout(() => {
        console.log("Logged after 3 secs.");
    }, 3000);
    callback();
}

function displayMessage() {
    console.log("Log it!");
}
    
exampleFunc(() =>
{
    console.log("Further code.");
});

displayMessage();

我预计在调用 exampleFunc() 后,程序将等待 3 秒,然后调用回调和其余代码。但是,代码的顺序是:

Starting...
Further code.
Log it!
Logged after 3 secs.

为什么会这样?我预计该程序将输出 "Starting",然后等待并记录 "Logged after 3 secs.",然后转到回调并输出 "Further code",最后 "Log it!".

调用 setTimeout 不会导致该函数中代码的进一步执行延迟。 setTimeout 安排超时,然后立即.

继续执行函数中的其余代码

您需要在 setTimeout 回调中调用 callback ,以便它仅在 3 秒后运行。

您还需要将 displayMessage 的调用放在传递给 exampleFunc 的回调中。

function exampleFunc(callback) {
  console.log("Starting...");
  setTimeout(() => {
    console.log("Logged after 3 secs.");
    callback();
  }, 3000);
}

function displayMessage() {
  console.log("Log it!");
}

exampleFunc(() => {
  console.log("Further code.");
  displayMessage();
});