js线程&定时器

Posted 人圭立日

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js线程&定时器相关的知识,希望对你有一定的参考价值。

1 输出结果依次为1、3、20

<script>
    var num = 10;
    alert(1);
    num = 20;
    setTimeout("alert(num)",0);
    alert(3);
</script>

2 输出4

for(var i=0; i<3; i++){
  setTimeout(function (){
    console.log(i);
  }, 0)
}

javascript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序.注意这里的浏览器模型定时计数器并不是由JavaScript引擎计数的,因为JavaScript引擎是单线程的,如果处于阻塞线程状态就计不了时,它必须依赖外部来计时并触发定时,所以队列中的定时事件也是异步事件。

同步任务(for循环、console等)

异步任务(回调函数以及ajax、setTimeout等)

于是,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程(call stack)任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。

具体来说,异步运行机制如下:

(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。

 只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会不断重复。  

所谓"回调函数"(callback),就是那些会被主线程挂起来的代码,前面说的点击事件$(selectot).click(function)中的function就是一个回调函数。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。例如ajax的success,complete,error也都指定了各自的回调函数,这些函数就会加入“任务队列”中,等待执行。

 








以上是关于js线程&定时器的主要内容,如果未能解决你的问题,请参考以下文章

浏览器Js运行机制

JS高阶---定时器相关

JS 定时器&异步任务与函数节流

JavaEE & 线程案例 & 定时器 & 线程池 and 工厂模式

测试片段不执行定时器或示例超时

js的事件循环(Eventloop) 机制