zoukankan      html  css  js  c++  java
  • setTimeout运行机制简要理解

    经典例子辅助理解setTimeout工作原理

    运行结果:

    约1秒后输出:1,
    再过约1秒后输出:2,
    接着才立即输出:时间流逝了: 2002 毫秒
    最后输出:时间又流逝了: 2003 毫秒

    在现有浏览器环境中,Javascript执行引擎是单线程的,主线程的语句和方法,会阻塞定时任务的运行,在Javascript执行引擎之外,存在一个任务队列,当在代码中调用setTimeout()方法时,注册的延时方法会挂到浏览器内核其他模块处理,当延时方法到达触发条件,即到达设置的延时时间时,该模块再将要执行的方法添加至该模块的任务队列中。这一过程与执行引擎主线程独立,执行引擎在主线程方法执行完毕,到达空闲状态时,才会从该模块的任务队列中顺序提取任务来执行,这期间的时间,可能大于注册任务时设置的延时时间;

    浏览器在空闲状态下,会不断的尝试从模块的任务队列中提取任务,这称为事件循环模型;

    再回头看下前面的代码,第二个setTimeout()的延迟方法的延迟时间是10毫秒,比第一个要早触发啊!为什么执行结果却在后面?因为它被之前的代码阻塞了约1000.5~1001毫秒了(视浏览器的处理速度),等他挂到处理模块,等到触发时间添加进任务队列时,第一个setTimeout()的延迟方法早就被添加到模块的任务队了,而引擎主线程是按顺序提取得,所以,你应该懂了吧?

    再来一个例子

    运行结果:

     首先是console.log出来的是 ”0“,这个是毫无疑问的,然后再alert出”100“。

  • 相关阅读:
    测试杂谈
    使用jQuery完成表单验证
    session&&cookie
    jQuery中关于toggle的使用
    Regist&Login
    关于线程的面试题
    成语验证码所需素材
    验证码测试-demo
    java动态生成验证码图片
    servlet-向页面输出中文出现乱码处理方式
  • 原文地址:https://www.cnblogs.com/DivHao/p/6506586.html
Copyright © 2011-2022 走看看