最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

JS

互联网 admin 42浏览 0评论

JS

setTimeout(fn, time),超时调用,在时间大于等于 time 时调用;

setInterval(fn, time),是间歇调用,每隔 time 调用一次。从载入后,每隔指定的时间就执行一次表达式,只要窗口不关闭或 clearInterval() 调用就会无限循环下去

虽然两者不一样,但是却可以相互模拟。具体使用那个,以具体的需求和场景具体分析,就像for循环可以模拟所有的循环一样(包括分支,以及do while一样)。一般情况下 setTimeout() 用于延迟执行某方法或功能;setInterval() 则一般用于刷新表单,对于一些表单的假实时指定时间刷新同步

这种重复定时器的规则有两个问题:

  1. 某些间隔会被跳过

  2. 多个定时器的代码执行时间可能会比预期小。

为了避免setInterval()的重复定时器的这两个缺点,可以使用模拟setInterval

/*** * @param {*} dom1  启动定时器的元素* @param {*} dom2  关闭定时器的元素* @param {*} fn  需要执行的定时器函数* @param {*} interval 定时器的时间间隔*/
function setTimeout_setInterval(dom1, dom2, fn, interval) {var timer = time;var flag = true;function time() {fn()setTimeout(time, interval);};dom1.onclick = function() {if (typeof time === "function") {time();} else {time = timer;time();}}dom2.onclick = function() {time = null;}
}

模拟 setTimeout() :用 setInterval() 模拟 setTimeout() 很简单,在 setInterval() 执行一次后,立刻关闭窗口(当然这是耍无赖)或者执行 clearInterval() 方法(这个靠谱点)。clearInterval() 需要在 setInterval()执行code方法内或其他地方执行,不能紧接着 setInterval() 后面执行,那样setInterval() 还没等到执行,就已经被干掉了

var intervalNum = 0, clearId = 0;
function testsetInterval(){var date = new Date();console.log(date.getSeconds());console.log("setInterval", intervalNum++);clearInterval(clearId);     //也可以在此执行
}
function testFuntion() {clearId = setInterval(function () {testsetInterval();          //每隔4秒调用testsetInterval()// clearInterval(clearId);     //可以在此执行},4000);
}

上面代码实现了递归调用,这样做的好处是:在前一个定时器代码执行完成之前,不会向队列插入新的定时代码,确保不会有任何的缺失间隔。而且,它保证在下一次定时器代码执行之前,至少要等待指定的时间间隔。

JS

setTimeout(fn, time),超时调用,在时间大于等于 time 时调用;

setInterval(fn, time),是间歇调用,每隔 time 调用一次。从载入后,每隔指定的时间就执行一次表达式,只要窗口不关闭或 clearInterval() 调用就会无限循环下去

虽然两者不一样,但是却可以相互模拟。具体使用那个,以具体的需求和场景具体分析,就像for循环可以模拟所有的循环一样(包括分支,以及do while一样)。一般情况下 setTimeout() 用于延迟执行某方法或功能;setInterval() 则一般用于刷新表单,对于一些表单的假实时指定时间刷新同步

这种重复定时器的规则有两个问题:

  1. 某些间隔会被跳过

  2. 多个定时器的代码执行时间可能会比预期小。

为了避免setInterval()的重复定时器的这两个缺点,可以使用模拟setInterval

/*** * @param {*} dom1  启动定时器的元素* @param {*} dom2  关闭定时器的元素* @param {*} fn  需要执行的定时器函数* @param {*} interval 定时器的时间间隔*/
function setTimeout_setInterval(dom1, dom2, fn, interval) {var timer = time;var flag = true;function time() {fn()setTimeout(time, interval);};dom1.onclick = function() {if (typeof time === "function") {time();} else {time = timer;time();}}dom2.onclick = function() {time = null;}
}

模拟 setTimeout() :用 setInterval() 模拟 setTimeout() 很简单,在 setInterval() 执行一次后,立刻关闭窗口(当然这是耍无赖)或者执行 clearInterval() 方法(这个靠谱点)。clearInterval() 需要在 setInterval()执行code方法内或其他地方执行,不能紧接着 setInterval() 后面执行,那样setInterval() 还没等到执行,就已经被干掉了

var intervalNum = 0, clearId = 0;
function testsetInterval(){var date = new Date();console.log(date.getSeconds());console.log("setInterval", intervalNum++);clearInterval(clearId);     //也可以在此执行
}
function testFuntion() {clearId = setInterval(function () {testsetInterval();          //每隔4秒调用testsetInterval()// clearInterval(clearId);     //可以在此执行},4000);
}

上面代码实现了递归调用,这样做的好处是:在前一个定时器代码执行完成之前,不会向队列插入新的定时代码,确保不会有任何的缺失间隔。而且,它保证在下一次定时器代码执行之前,至少要等待指定的时间间隔。

发布评论

评论列表 (0)

  1. 暂无评论