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