首页 > javascript异步编程和单线程之间的一些疑惑

javascript异步编程和单线程之间的一些疑惑

这两天在研究js异步编程机制,查阅了很多资料,中文的英文的都有。大致上对js异步实现有些了解。但有几点不太理解。

第一个问题:

有一点无论是国内的资料还是英文的,都没有讲到到(可能是过于基础,本人是业余前端,对线程这一块不是很了解)。我们说javascript是单线程,即一次只能执行一个任务,前一个任务结束,后一个才会执行。这是从抽象后的javascript的语言层面说的,还是指各种编译环境内部本来就是单线程?

比如当Thread Pool里注册了各种事件,当有事件触发,就会将callback function 移至Event Queue,这一过程需要不断监听,是需要线程的吧?但此时Event loop本身就在不断监听执行栈和Event Queue,这又是一条线程。可能表述不清,我的意思是事件被触发,并且传递给事件列队和Event Loop不断监听并执行消息列队里的函数并不是同一线程完成的吗?或者事件是编译器底层通过另一个线程来监听,然后再传递给js线程?

第二个问题:

在阮一峰老师博客(链接描述)中写因为js异步执行,以下两段代码等价

   var req = new XMLHttpRequest();
    req.open('GET', url);    
    req.onload = function (){};    
    req.onerror = function (){};    
    req.send();
   var req = new XMLHttpRequest();
    req.open('GET', url);
    req.send();
    req.onload = function (){};    
    req.onerror = function (){}; 

但另一位专业js老师(链接描述)指出有错误【这个调用其实有个默认回调函数,Ajax结束后,执行回调函数,回调函数检查状态,决定调用onload还是onerror。所以只要在回调函数执行之前设置这两个属性就行】具体批注不太懂,请问是如何理解的呢?


csdn 那家伙说的是对的,但哔哔了半天没有说清楚。

有一种情况会使其不等价: 如果ajax的响应很快,快到 send 还没返回或刚返回但还没往下走时,数据到了回调却还没设置,数据就会被ignore。你可以通过延时 3 秒再设置回调来观察这个现象。

但实际中,ajax 是几乎不可能比回调设置快的。因此这两段近似等价。


第一个问题已经解决,js是单线程是指执行层面不能同时执行多条语句。但是js宿主如浏览器并不是单线程的,异步请求是交给浏览器其他线程来完成,添加到事件列队,js执行完栈中的代码,就会再去不断执行事件列队里的函数。
第二个还在找答案中

【热门文章】
【热门文章】