setInterval(function(){
run();
}, 1000);
function run(){
setTimeout(function(){
run();
}, 1000);
}
run();
我想问一下,在效果上,这两个方法完全一样,但是本质上区别在哪里呢?
补充一下:我想问的是在线程中这两种实现方法有什么不同之处,或者说在队列中的区别。
setInterval(function(){
run();
}, 1000);
function run(){
setTimeout(function(){
run();
}, 1000);
}
run();
我想问一下,在效果上,这两个方法完全一样,但是本质上区别在哪里呢?
补充一下:我想问的是在线程中这两种实现方法有什么不同之处,或者说在队列中的区别。
setinterval 循环执行 如果包含在一个点击事件中 setinterval设置的是3000也就是三秒,你点击一次加快一次点击一次加快一次,最后飞速的变换。就像汽车一样踩一脚油门加速一次踩一次加速一次
settimeout 执行一次
setInterval 是持续占有独立线程的一个定时触发函数!
嵌套setTimeout,实现的功能和前者一样!但是不会持续占有一个线程的资源,执行完当前的方法,会释放当然的线程资源,等待下次触发,会重新申请资源!
我记得有这么一个区别,不知道有没有记错!
setInterval是每隔一段时间调用指定函数(N次)
setTimeout是在一段时间后调用指定函数(仅一次)
这区别很明显了吧,虽然你题目中使用setTimeout达到了setInterval的效果,但我觉得是完全多余。
实际写代码的时候,就看你的需求是怎样,针对需求去写对应的代码。
另外,第一个代码写成setInterval(run,1000);
也是可以执行的。
setInterval保证“开始执行run的时间间隔” > 1000
setTimeout保证“两次执行run之间的间隔” > 1000
比如这个setInterval的例子,每间隔100ms执行一次,但fn本身执行需要150ms,导致在200ms时候第二个run函数加入到事件队列但是他需要等待第一个run函数在150ms执行完毕之后再执行,这就导致了这两个run函数“开始执行”的时间间隔是150ms,但是“两次run之间的间隔”是0ms
setTimeout是在第一次run执行完毕之后才再次调用setTimtout(fn, time);将其加入到事件队列,这就保证第一个run执行完毕 到 第二个run开始执行的时间间隔 > time
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
以上面的代码来说, 虽然设置的是10s执行一次, 但是实际时间却是需要
// 其他代码
的执行时间来确定即setTimeout的间隔时间是,
// 其他代码
执行时间 + 10s而setInterval, 不会有上面的问题, 但是如果
run()
的执行时间, 操作大于10s, 那么甚至可能跳过任务