Javascript 什么';如果代码跳过宏任务,回调函数的用途是什么?

Javascript 什么';如果代码跳过宏任务,回调函数的用途是什么?,javascript,callback,Javascript,Callback,最近,我试图理解JavaScript中的回调函数,但是,这个概念离我的理解还很远。我有这样的代码: function exampleFunc(callback) { console.log("Starting..."); setTimeout(() => { console.log("Logged after 3 secs."); }, 3000); callback(); } function di

最近,我试图理解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.

为什么会这样?我期望程序将输出
“开始”
,然后等待并记录
“3秒后记录”
,然后转到回调并输出
“进一步的代码”
,最后,
“记录!”
,调用
设置超时
不会导致该函数中代码的进一步执行延迟
setTimeout
计划一个超时,然后立即继续执行函数中的其余代码

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

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

函数exampleFunc(回调){
console.log(“启动…”);
设置超时(()=>{
日志(“3秒后记录”);
回调();
}, 3000);
}
函数displayMessage(){
log(“记录它!”);
}
示例func(()=>{
log(“进一步代码”);
displayMessage();

});调用
设置超时
不会导致该函数中代码的进一步执行延迟
setTimeout
计划一个超时,然后立即继续执行函数中的其余代码

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

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

函数exampleFunc(回调){
console.log(“启动…”);
设置超时(()=>{
日志(“3秒后记录”);
回调();
}, 3000);
}
函数displayMessage(){
log(“记录它!”);
}
示例func(()=>{
log(“进一步代码”);
displayMessage();

});为什么我不能在
exampleFunc()
之外执行
displayMessage()
,但我必须将它放入
exampleFunc()
?为什么如果我这样做,那么消息
“Log it!”
会在
“Starting…”
之后立即显示?因为调用
exampleFunc
不会导致在超时完成之前阻止代码的进一步执行;就像在
exampleFunc
中一样,您必须将
callback()
放入
setTimeout
中才能等待
callback
,您还必须将
displayMessage
放在传递给
exampleFunc
的回调中。那么,如果我可以在
setTimeout()
中进一步编写代码,而不是调用另一个函数,那么回调函数的用途是什么呢?传递单独的回调可以使代码看起来更简单,更容易理解,特别是如果回调具有良好的信息名称。除非脚本相当大和复杂,否则可以随意在
setTimeout
中写入所有内容,直到它开始让您觉得有问题。
正在阻塞;在
while
完成之前,它不会继续执行程序的其余部分,也不会向调用方提供控制流
setTimeout
schuedoesforthefuture
while
立即重复地执行某些操作(while块中的任何操作),直到while条件失败。为什么我不能在
exampleFunc()
之外执行
displayMessage()
,但我必须将其放入
exampleFunc()
中?为什么如果我这样做,那么消息
“Log it!”
会在
“Starting…”
之后立即显示?因为调用
exampleFunc
不会导致在超时完成之前阻止代码的进一步执行;就像在
exampleFunc
中一样,您必须将
callback()
放入
setTimeout
中才能等待
callback
,您还必须将
displayMessage
放在传递给
exampleFunc
的回调中。那么,如果我可以在
setTimeout()
中进一步编写代码,而不是调用另一个函数,那么回调函数的用途是什么呢?传递单独的回调可以使代码看起来更简单,更容易理解,特别是如果回调具有良好的信息名称。除非脚本相当大和复杂,否则可以随意在
setTimeout
中写入所有内容,直到它开始让您觉得有问题。
正在阻塞;在
while
完成之前,它不会继续执行程序的其余部分,也不会向调用方提供控制流
setTimeout
schuedoesforthefuture
while
立即重复执行某些操作(while块中的任何操作),直到while条件失败。