我正在读这个:
http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/
有这句话:
“单个执行线程要求运行时执行 操作,提供回调函数,然后继续前进 别的。操作完成后,会显示一条消息 与提供的回调函数一起排队。在某些时候 未来,消息已经出列并且回调被解雇。“
所以我脑子里想到的一个例子是:
console.log("x")
someAjaxCall(function({
callbackcode
})
console.log("y")
问题:
1)someAjaxCall是操作权,callbackcode是回调?
2)所以基本上当调用someAjaxCall时,一条消息被排队,指向回调函数是否正确?调用console.log(“y”)或清空堆栈后,消息出列并触发回调/回调代码?
然后是这句话:
“调用者与响应的解耦允许 JavaScript运行时在等待你的时候做其他事情 要完成的异步操作和它们要触发的回调。“
3)什么是运行时?那是什么意思?我只是认为callstack可以恢复执行,当它清空时...然后消息可以出列?
答案 0 :(得分:0)
Javascript运行时是执行所有Javascript代码的软件。这意味着当Javascript正在等待对AJAX调用的响应时,它可以运行其他东西。例如,您可以显示"请稍候......"在等待服务器执行冗长的数据库查询时使用微调器。收到响应后,将执行回调,并且可以停止微调器并显示数据。
答案 1 :(得分:0)
将JavaScript引擎视为在幕后看起来像这样:
while(true) {
var event = updateUIAndDoNetworkingStuffAndWaitForIncomingEvent();
if(event.hasJavaScriptHandler) {
event.runJavaScriptHandlerForEvent();
}
}
在某些时候,您的代码会运行。您console.log("x")
,运行someAjaxCall
功能,然后运行console.log("y")
。在内部,someAjaxCall
可能正在修改一些你无法看到的告诉浏览器的状态“嘿,当你到达updateUIAndDoNetworkingStuffAndWaitForIncomingEvent
时,作为”做网络事情“的一部分,也要做这个HTTP请求,当你完成后,发动一个事件“。作为该记录的一部分,它存储您的回调函数。然后,几次以后通过循环,updateUIAndDoNetworkingStuffAndWaitForIncomingEvent
看到HTTP请求或其他任何已完成,并返回一个事件说“嘿,你要求我做一段时间前的HTTP请求 - 好吧,它完成了“接着它的代码然后注意到它存在一个回调并调用它,并且你的代码在你传递给someAjaxCall
的回调中继续执行。