2015-07-04 54 views
5

我读这样的:Javascript事件循环。澄清需要

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

此问题的答案[JavaScript如何在后台处理AJAX响应?](http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649)可能会回答你所问的大部分内容。这个问题甚至可能是那个问题的一个重要问题。 – jfriend00

回答

0

Javascript运行时是执行所有Javascript代码的软件。这意味着当Javascript正在等待对AJAX调用的响应时,它可以运行其他事情。例如,您可以在等待服务器执行冗长的数据库查询时使用微调控制器显示“Please wait ...”。收到响应后,将执行回调,并停止微调器并显示数据。

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的回调中恢复执行。