JS setTimeout与setInterval的区别


Posted in Javascript onApril 20, 2022

I. 总述

首先,setTimeout()和setInterval()函数是JavaScript中两个很重要的关于"时间的函数",因此,我们在学习JavaScript的过程中,一定要对这两个函数有一个深入的学习,它们两个函数也是经常被使用!

 其中,如果分别用一句话来概括这两个函数,那么应该是这样的:

setTimeout(): 该函数能够按照设定的时间值延迟执行其中的事件。

setInterval(): 该函数能够按照设定的时间值作为间隔,周期性的执行其中的时间。

当然了,只是简述,细节方面,我们在下面的部分给大家做讲解。

II. setTimeout()函数

首先是我们的setTimeout()函数,它的格式是怎么样的呢:

setTimeout(function,times);

是的,就是这么简单的格式,其中,我们需要两个参数,分别是一个函数和一个int值函数表示延迟一段时间后要执行的函数体,int值就是我们说的这段时间,例如我们看这段简单的代码:

setTimeout(function(){
    alert("hello,setTimeout()");
}, 1000);

运行之后,它会在1s的延迟之后,弹出一个弹框,其中1000的单位是毫秒!

JS setTimeout与setInterval的区别

学到这里,大家觉得很简单,对吗?好的,那我给一段代码,大家猜一下它会输出什么

for (var i = 1; i <= 5; i++) {
    setTimeout(function () {
        alert(i)
    }, 1000)
}

哎,有人要说了,简单啊,这不是输出:1 2 3 4 5 吗?

然而实际上是这样的:【点我揭晓】

也就是,它输出了5 5 5 5 5,所以这是为什么呢?因为setTimeout()是一个异步执行函数,说人话就是,它里面的函数体,并不会在每一次执行的时候立刻运行,而是会丢进执行队列中,等待"主线任务"全部完成,才会执行它

于是在5次for循环后,i的值是5,传进去,弹出了5个5。

那么有没有解法呢?我给大家两种解法:

1️⃣ 使用关键字let:

for (let i = 1; i <= 5; i++) {
    setTimeout(function () {
        alert(i)
    }, 1000)
}

那为啥使用let就可以了呢:

其实使用let之后,也没有改变执行机制仍然是最后执行的alert()但是let可以在每一次把更新的变量i传进函数体内,也就是每一次的i加1之后,会把这个新值放进队列中对应的函数内,于是就解出了这个问题。

2️⃣ 定义一个外部变量:

我们在外部定义一个变量,这样这个变量每一次会被放入队列中,依旧不改变本身的执行机制:

var j = 1;
for (i = 1; i <= 5; i++) {
    setTimeout(function () {
        alert(j)
        j++;
    }, 1000);
}

第二种做法,更容易被别人看懂,也更适合做项目时实际使用。

III. setInterval()函数

第二个函数setInterval()就没那么复杂了,但是它的功能确实很强大的,我们先看看它的使用格式

setInterval(function,times);

依旧是两个参数,同setTimeout()格式一致,它可以以设置的times为间隔来循环重复function,我们用一个小例子来测试一下:

setInterval(function(){
    alert('hello,setInterval()');
}, 1000);

运行之后,每过1秒,就会弹出一个弹窗,显示这段话。

那运行之后,我们想当然会有一个问题,那就是可以在某个特定的时机让它不再循环执行了吗?答案是肯定滴,只不过我们需要定义一个setInterval()函数的对象,我们一般取名叫:timer

var i = 5;
var timer = setInterval(function(){
    i --;
    if(i < 0){
    clearInterval(timer);
}
    alert('i');
    
}, 1000);

上面的代码中,我们给setInterval创建了一个对象叫timer,在外部我们定义了另一个变量i,之后我们每一次执行Interval内的函数时,就让 i-1 减到0以下,清除定时器

clearInterval(timer对象);

上面这句话是清除定时器的代码传入一个setInterval()函数的对象即可。

IV. 新年倒计时案例

最后,我们用学习的setTimeout()函数和setInterval()函数联动做一个新年倒计时案例吧:

我们想要这样的效果:

首先,实现在屏幕上展示60秒倒计时;

在倒计时为0后,弹窗展示新年快乐!

有人看了这个说明,觉得那么我们的代码应该是这样的:

var element = document.getElementById("xin-nian")
var clock = 60;
var timer = null;
timer = setInterval(function () {
    element.innerHTML = "新年倒计时:" + clock + " !";
    console.log(clock)
    clock--;
    if (clock < 0) {
        clearInterval(timer);
        alert("新年快乐!");
    }
}, 1000);

乍一看,好像没问题,但实际运行的时候,由于向html写入内容有一个小延迟,会导致最后倒计时0这个数字没被写进去就会弹窗,因此我们要在倒计时最后一秒,用setTimeout()做一个小缓冲

if (clock < 0) {
    clearInterval(timer);
    setTimeout(function () {
        alert("新年快乐!")
    }, 500)
}

于是完整的代码应该是这样的:

<!DOCTYPE html>
 
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>新年倒计时</title>
    <style>
        body {
            background-image: url(./1.jpg);
        }
    </style>
</head>
 
<body>
    <h1 id="xin-nian" style="text-align: center;margin-top: 250px;font-size: 50px;"></h1>
    <script>
        var element = document.getElementById("xin-nian")
        var clock = 60;
        var timer = null;
        timer = setInterval(function () {
            element.innerHTML = "新年倒计时:" + clock + " !";
            console.log(clock)
            clock--;
            if (clock < 0) {
                clearInterval(timer);
                setTimeout(function () {
                    alert("新年快乐!")
                }, 500)
            }
        }, 1000);
    </script>
 
</body>
 
</html>

实现的效果是下面这样的动图

JS setTimeout与setInterval的区别

总结

到此这篇关于JavaScript setTimeout和setInterval的用法与区别的文章就介绍到这了!

Javascript 相关文章推荐
script标签的 charset 属性使用说明
Dec 04 Javascript
js控制淡入淡出示例代码
Nov 12 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
Dec 02 Javascript
AngularJs动态加载模块和依赖注入详解
Jan 11 Javascript
jquery判断页面网址是否有效的两种方法
Dec 11 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
Feb 06 Javascript
uploader秒传图片到服务器完整代码
Apr 22 Javascript
JavaScript中splice与slice的区别
May 09 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
Sep 12 Javascript
微信小程序CSS3动画下拉菜单效果
Nov 04 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
Dec 28 Javascript
在vue中嵌入外部网站的实现
Nov 13 Javascript
Vue OpenLayer测距功能的实现
vue 给数组添加新对象并赋值
Apr 20 #Vue.js
vue 数字翻牌器动态加载数据
Apr 20 #Vue.js
vue3.0 数字翻牌组件的使用方法详解
Apr 20 #Vue.js
vue封装数字翻牌器
Apr 20 #Vue.js
vue特效之翻牌动画
Apr 20 #Vue.js
避坑之 JavaScript 中的toFixed()和正则表达式
Apr 19 #Javascript
You might like
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
打造计数器DIY三步曲(下)
2006/10/09 PHP
php Smarty date_format [格式化时间日期]
2010/03/15 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
Ajax+PHP实现的分类列表框功能示例
2019/02/11 PHP
PHPstorm激活码2020年5月13日亲测有效
2020/09/17 PHP
Javascript实例教程(19) 使用HoTMetal(2)
2006/12/23 Javascript
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
百度地图API之本地搜索与范围搜索
2015/07/30 Javascript
angular.bind使用心得
2015/10/26 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
微信小程序媒体组件详解(视频,音乐,图片)
2017/09/19 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
详解Vue组件之作用域插槽
2018/11/22 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
2020/05/10 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
原生js实现自定义难度的扫雷游戏
2021/01/22 Javascript
[50:20]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第四局
2016/03/06 DOTA
使用IPython下的Net-SNMP来管理类UNIX系统的教程
2015/04/15 Python
详解Python实现按任意键继续/退出的功能
2016/08/19 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
Python下利用BeautifulSoup解析HTML的实现
2020/01/17 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
金讯Java笔试题目
2013/06/18 面试题
细节决定成败演讲稿
2014/05/12 职场文书
党的群众路线教育实践活动剖析材料
2014/09/30 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书