首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript函数执行模型

JavaScript函数执行模型
EN

Stack Overflow用户
提问于 2014-03-31 18:20:45
回答 1查看 34关注 0票数 0

JSVM是否只在一个线程中运行?我想知道JavaScript函数是如何在VM中执行的。下面的源代码很有趣:

代码语言:javascript
运行
复制
// include jQuery as $
function test() {
  $.ajax({url:"xxx.com"})
    .success(function() {alert("success 1");})
    .fail(function() {alert("fail 1");});
  $.ajax({url:"yyy.com"})
    .success(function() {alert("success 2");})
    .fail(function() {alert("fail 2");});
  while(true);
}

它将使模具循环在“同时”行,永远不会弹出任何警告对话框,以显示“成功”或“失败”。我们知道在$.ajax内部,VM创建XMLHttpRequest并发送一个HTTP请求。发出两个请求后,它满足"while“行。因此,我认为JSVM:

1)一次只能处理函数调用。(函数是原子的)

2)遵循规则:先到先得。

我的想法对吗?有人能解释JSVM的内部实现吗?

更具体地说,如果使用AngularJS开发前端应用程序,我们想做一些事情,然后立即记录到远程服务器的日志,形式提交事件,如ng提交。

代码语言:javascript
运行
复制
function ngSubmitTest() {
  doA();
  recordA(ajax, remoteServer); // must after doA()
}

如果recordA使用AJAX,我们应该确保在ng提交重定向页面之前完成recordA,同时杀死旧页面和VM (如果旧页面被杀死,recordA可能不会完成)。一种解决方案是使用async=false进行AJAX。我想知道还有什么解决办法吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-31 18:47:29

JS的实现取决于运行它的上下文。

每个浏览器都有自己的实现,只要遵循语言规范,他们就可以随心所欲。

如果它在一个线程或多个线程上运行,它不会困扰您,但是您可以确保JavaScript不是一种“线程”语言,它与事件循环流一起工作,在该流程中触发事件,然后触发连续函数,直到没有更多的调用为止。这就是为什么在编写“好”代码时很难在JavaScript中阻止UI的原因。

关于这是如何工作的一个很好的例子,以及事件循环和经典线程处理之间的差异,是node.js,我将给出一个例子:

假设您正在服务器上侦听请求,在请求到达2秒后,您将发送一条消息。现在,让我们假设您复制该侦听器,并且两个侦听器都做相同的事情。如果您请求服务器,您将在请求发出后2秒同时获得这两条消息,而不是一条消息在2秒,另一条消息在4秒。这意味着两个侦听器同时运行,而不是像大多数系统那样遵循线性执行。

Node运行Chrome的V8,如果你想知道,它是一个非常专业的JS解释器,当它出现的时候,它是一个故障。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22769205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档