欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

javascript的执行机制讲解

程序员文章站 2023-10-28 14:35:10
javascript的执行机制讲解 settimeout(function(){console.log(1);}, 0); console.log(2); 这段代码的运行...

javascript的执行机制讲解

settimeout(function(){console.log(1);}, 0);
console.log(2);

这段代码的运行结果是2,1,而不是1,2,这是因为js的执行机制。

首先,我们知道js是单线程的,即同时只能处理一件事,但是是多线程的,那js为什么不能是多线程呢,主要因为js处理用户的简单交互,如果同时处理多个事件就很容易造成混乱。

js处理时间可以分成主线程和任务队列(也可以叫等待队列),一个一个地处理主线程中的任务,等到主线程中的任务都执行完了,再执行等待队列中的任务。在主线程执行过程中如果任务队列有任务完成了则自动进入主线程排队等待执行,但像定时器如果设置了执行时间,如果等待队列中轮到他进入主线程执行,也要先等待他的延迟时间再进入主线程执行。主线程从任务队列中源源不断的读取事件,这个过程是循环的,于是也叫事件循环event loop.

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

这两段代码结果是一样的。

前面说的定时器,包括settimeout和setinterval执行机制是一样的,比如settimeout(function(){},0),第一个参数是回调函数,第二个是延迟执行的毫秒数。延迟时间为0不代表不延迟,直接执行,而是在能执行的时候立即执行,即主线程和等待队列中他前面的任务都执行完才可以。