setTimeout()与setInterval()

时间:2021-06-07 23:25:58

一、setTimeout与setInterval的用法(http://www.css88.com/archives/5804)

setTimeout是超时调用,javascript是一个单线程的解析器,因此在一定时间内只能执行一段代码;setTimeout的第二个参数只是告诉javascript再过多久将当前任务添加到执行队列中,如果队列是空的,当前添加的代码就会立即执行;如果队列不是空的,就会等前面的代码执行完了之后再执行。(所以超时调用中的方法不一定就会在给定的超时时间到了之后立马执行,前面的代码有可能执行的时间超过这个给定的超时时间)

超时调用每次调用只会执行一次,要想反复执行超时调用,setTimeout函数内部再添加setTimeout方法。

setTimeout ( function () {
var div = document.getElementById("div4");
//var left = parseInt(div.style.left) + 5;
var left = div.offsetLeft + 5; div.style.left = left + "px";
if (left < 200) {
setTimeout( arguments.callee, 50);
} }, 50);

setInterval是间歇调用,调用一次一直执行,直到页面卸载。和setTimeout一样,指定的时间间隔表示的是何时将定时器的代码添加到队列中;setInterval确保了定时器代码规则的插入到队列中,但是,如果定时器代码之前的代码执行时间比定时器间隔要长,会出现如下情况:1、某些间隔可能会被跳过,2、多个定时器的代码执行之间的间隔可能会比预期的小。

var num = 0;
var max = 10;
var intervalId = null; function incrementNumber () {
num ++ ; if (num === max) {
clearInterval (intervalId);
}
} intervalId = setInterval (incrementNumber, 500);

所以一般用setTimeout方法来实现一个定时器(如第一个实例)。

var num = 0;
var max = 10;
//var intervalId = null; function incrementNumber () {
num ++ ; if (num < max) {
setTimeout (incrementNumber, 1000);
console.log("1");
}
} setTimeout (incrementNumber,1000);

2017-1-13更新:

问题模拟:下面的代码开始执行之后,如果先触发的是add这个事件,程序中就会存在多个定时器,最后clear掉的也是最后一个定时器,前面的定时器都无法被清除,如果知道定时器的id值也可以通过clearInterval()清除指定的定时器。后面的定时器的id覆盖了前面id,intervalTimer始终保存的是最后的定时器的id。

 var button = document.getElementById("clear");
var add = document.getElementById("add");
var intervalTimer = null;
zhixing();
function zhixing() {
intervalTimer=setInterval(function(){
console.log("in:"+intervalTimer);
console.log(1);
},3000);
console.log("out:"+intervalTimer); //一般是一个数字,Number
} button.onclick=function(){
alert("onclick...");
// clearInterval(2);
clearInterval(intervalTimer);
console.log("clear:"+intervalTimer); //一般是一个数字,Number
}; add.onclick = function() {
//zhixing();
intervalTimer=setInterval(function(){
console.log("in:"+intervalTimer);
console.log(22222);
},3000);
console.log("out:"+intervalTimer); //一般是一个数字,Number
};

总结: setTimeout调用一次执行一次,setInterval调用一次,一直执行直到页面卸载。

setInterval能够确保定时器代码被规则的加入到队列中,但使用setInterval也可能会产生一些问题,例如:某些间隔会被跳过,

多个定时器代码之间的执行间隔比预期的小。

setTimeout可以模拟出setInterval的执行方式,而且可以确保前一个定时器在执行完成之前不会向队列中插入新的定时器代码,

所以不会有缺失间隔的情况;也保证了下一次定时器代码执行之前,至少要等待指定的间隔。

一个定时器的执行时间,和其同步执行的js代码有关,指定的间隔时间,只是定时器被加入到队列中的最小时间。

将定时器的间隔时间设置为0时,代码会立即执行。

   var startTime = new Date();
setTimeout(function () {
console.log(new Date() - startTime);
}, 100); setTimeout(function () {
console.log("111111");
}, 0); setTimeout(function () {
console.log("22222");
});

setTimeout()与setInterval()的更多相关文章

  1. 深入理解定时器系列第一篇——理解setTimeout和setInterval

    × 目录 [1]setTimeout [2]setInterval [3]运行机制[4]作用[5]应用 前面的话 很长时间以来,定时器一直是javascript动画的核心技术.但是,关于定时器,人们通 ...

  2. 前端开发:setTimeout与setInterval 定时器与异步循环数组

    前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的, ...

  3. setTimeout和setInterval从入门到精通

    我们在日常web前端开发中,经常需要用到定时器方法. 前端中的定时器方法是浏览器提供的,并不是ECMAScript规范中的.是window对象的方法. 浏览器中的定时器有两种, 一种是每间隔一定时间执 ...

  4. setTimeout和setInterval定时器使用详解测试

    var len=4; while(len--){ var time=setTimeout(function(){ console.log(len); },0); console.log(time); ...

  5. setTimeout,setInterval原理

    function a() { setTimeout(function(){alert(1)},0); alert(2); } a(); 和其他的编程语言一样,Javascript中的函数调用也是通过堆 ...

  6. Javascript的setTimeOut&lpar;&rpar;和setInterval&lpar;&rpar;的定时器用法

    Javascript用来处理延时和定时任务的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请 ...

  7. setTimeout和setInterval的注意事项

    精准问题 setTimeout的问题在于它并不是精准的,例如使用setTimeout设定一个任务在10ms后执行,但是在9ms后,有一个任务占用了5ms的cpu时间片,再次轮到定时器执行时,时间已经过 ...

  8. setTimeout和setInterval的区别以及如何写出效率高的倒计时

    1.setTimeout和setInterval都属于js中的定时器,可以规定延迟时间再执行某个操作,不同的是setTimeout在规定时间后执行完某个操作就停止了,而setInterval则可以一直 ...

  9. setTimeout 和 setInterval

    设置定时器,在一段时间之后执行指定的代码,setTimeout与setInterval的区别在于setTimeout函数指定的代码仅执行一次 方法一: window.setTimeout(" ...

随机推荐

  1. 赠书:HTML5 Canvas 2d 编程必读的两本经典

    赠书:HTML5 Canvas 2d 编程必读的两本经典 这两年多一直在和HTML5 Canvas 打交道,也带领团队开发了世界首款基于HTML5 Canvas 的演示文档工具---AxeSlide( ...

  2. cursor or set-based

    标题可能和正文不太相符.我主要是记录工作中遇到使用游标的语句改成普通set-based operation,执行时间快了很多. 1.游标语句 declare @startDate dateTime d ...

  3. mybatis——使用mapper代理开发方式

    ---------------------------------------------------------------generatorConfig.xml------------------ ...

  4. vyos &lpar;三&rpar; HA

    http://empujapalla.blogspot.jp/2014/04/taming-beast-vyatta-66-ha-cluster.html 1 L2TP vpn high availa ...

  5. Spark实践的阶段性总结

    写这篇小总结是因为前段时间是自己业余时间对Spark相关进行了些探索,接下来可能有别的同事一起加入,且会去借用一些别的服务器资源,希望可以借此理下思路. 实践Spark的原因 在之前Spark简介及安 ...

  6. Analyzing the Go runtime scheduler from source code perspective

    http://www.cs.columbia.edu/~aho/cs6998/reports/12-12-11_DeshpandeSponslerWeiss_GO.pdf http://www.cs. ...

  7. linux POSIX 信号量介绍

    信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)使用.多线程可以同时运行多个线程函数完成功能,但是对于共享数据如果不加以锁定,随意改变共享数据的值会发生 ...

  8. APP 测试 与 WEB 测试的本质区别

    单纯从功能测试的层面上来讲的话,APP 测试.web 测试 在流程和功能测试上是没有区别的 根据两者载体不一样,则区别如下: 1.系统结构方面 web项目,b/s架构,基于浏览器的:web测试只要更新 ...

  9. 【leetcode 简单】 第七十四题 缺失数字

    给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数. 示例 1: 输入: [3,0,1] 输出: 2 示例 2: 输入: [9,6,4,2 ...

  10. dfs序七个经典问题(转)

    我这个人不怎么喜欢写轻重链剖分和LCT 还是喜欢dfs序.括号序列之类的 毕竟线段树好写多了 然后就有了这篇转载的文章 写在这边以后有时间看看 原文链接:https://www.cnblogs.com ...