浅谈setTimeout 与 setInterval

 更新时间:2015年06月23日 09:00:50   投稿:hebedich  
实际上,setTimeout和setInterval的语法相同。它们都有两个参数,一个是将要执行的代码字符串,还有一个是以毫秒为单位的时间间隔,当过了那个时间段之后就将执行那段代码。不过这两个函数还是有区别的

最新写代码中时,看到项目中有人用到了 setTimeout(fun,0),于是想总结一下。个人理解,如果有错误的地方还请指出。THX

  要想理解JavaScript的定时器是如何工作的,先要明白 JavaScript 引擎是单线程的。这个可以理解为 javascript 引擎是一个服务员,它有一个服务的队列,所有的界面元素事件,定时触发器回调,异步请求回调都要在这个任务队列里排队,等待处理。所有任务都是一个最小单位,不会中断处理。这样就可以理解 setTimeout(fun,0) 了,它并不是代表立即执行该代码,除非任务队列为空(事实上,各个浏览器在实际执行这个的时候也是有差异了,比较新的浏览器实际可能是在4ms;老版本的可能更长一点,16ms也是可能的)。而 setTimeout(fun,time) 的意思就是多少时间后将 fun 回调加到这个任务队列中,也就是至少需要time时间才会执行fun。

  举个例子:

setTimeout(function () {
 console.log(1);
}, 0);
var tem = 0;
for (var i = 1; i < 1000000; i++) {
 tem += i;
};
console.log(2);

显示结果为

复制代码 代码如下:

2
1

  就是说,在执行 setTimeout 时,将 function 回调加入了任务队列,但并没有立即执行,因为js引擎还在忙着处理当前的js,而只在这段代码段执行完才去任务列表里取新的任务,所以结果就是先显示 2 后显示 1。

  setInterval(fun, time)方法是,每隔一定时间将fun添加到队列中,那么问题来,如果fun执行时间比 time 要长的时候怎么办?

  看一段代码

var num = 0;
var time = setInterval(function () {
 var tem = 0;
 for (var i = 1; i < 99999999; i++) {
 tem += i;
 };
 num ++;
 console.log(num);
}, 100);

setTimeout(function (){
 clearInterval(time);
}, 1000);

  意思是每隔100ms执行一段代码,在1s中后清除这个定时器。但是结果呢?

  显示结果为

复制代码 代码如下:

1
2
3

  也就是说,事实上,并没有执行到那么多次数。也就是说某些间隔会被跳过,这也就存在多个代码执行的间隔可能会比预期的小。原来在将定时器代码加入队列的时候,如果该定时器的代码实例存在时,该次定时器代码会被跳过。

  引用一张图片,就很好理解了。

以上所述就是本文的全部内容了,希望大家能够喜欢。

相关文章

  • JS对象类型赋值和原生类型赋值原理解析

    JS对象类型赋值和原生类型赋值原理解析

    在本文中,我试图以最简洁的方式来阐明JavaScript编程原理中对象类型赋值和原生类型赋值之间的区别,以及它们各自是如何工作的,感兴趣的朋友跟随小编一起看看吧
    2023-09-09
  • JS JSOP跨域请求实例详解

    JS JSOP跨域请求实例详解

    JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。这篇文章主要介绍了JS JSOP跨域请求实例详解的相关资料,需要的朋友可以参考下
    2016-07-07
  • Svelte反应式变量和函数工作原理详解

    Svelte反应式变量和函数工作原理详解

    这篇文章主要为大家介绍了Svelte反应式变量和函数工作原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 如何阻止小程序遮罩层下方图层滚动

    如何阻止小程序遮罩层下方图层滚动

    这篇文章主要介绍了如何阻止小程序遮罩层下方图层滚动,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 用javascript实现的仿Flash广告图片轮换效果

    用javascript实现的仿Flash广告图片轮换效果

    用javascript实现的仿Flash广告图片轮换效果...
    2007-04-04
  • 用JS实现HTML标签替换效果

    用JS实现HTML标签替换效果

    用JS实现HTML标签替换效果...
    2007-06-06
  • JS实现进入页面时渐变背景色的方法

    JS实现进入页面时渐变背景色的方法

    这篇文章主要介绍了JS实现进入页面时渐变背景色的方法,涉及javascript操作css控制背景色渐变的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Bootstrap按钮功能之查询按钮和重置按钮

    Bootstrap按钮功能之查询按钮和重置按钮

    一般情况下,查询列表有查询条件、查询按钮和重置按钮,输入查询条件,点击查询按钮查询列表等数据;点击重置按钮会将查询条件恢复到原始状态。接下来通过本文给大家介绍bootstrap实现查询按钮和重置按钮的方法,一起看看吧
    2016-10-10
  • JavaScript增加数组中指定元素的5种方法总结

    JavaScript增加数组中指定元素的5种方法总结

    在JS中数组方法是非常重要且常用的的方法,在此整理总结一番,下面这篇文章主要给大家介绍了关于JavaScript增加数组中指定元素的5种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • 关于JS中的作用域中的问题思考分享

    关于JS中的作用域中的问题思考分享

    这篇文章主要介绍了关于JS中的作用域中的问题思考分享,scope和 closure是 javascript中两个非常关键的概念,前者JS用多了还比较好理解而且容易体会到,而 closure就不一样了。这玩意是真的很容易迷糊,需要的朋友可以参考下
    2022-04-04

最新评论