JavaScript 中的 setTimeout 和 setInterval 方法
有时您不希望函数立即运行。您希望它重新执行,甚至在特定时间间隔后重复运行。JavaScript 为我们提供了两种实现方法: setTimeout
和 setInterval
。下面,我们将来理解这两个方法。
setTimeout
setTimeout
方法在停止后运行给定的函数。它设置一个定时器,并在时间终止时执行给定的函数(回调)。
setTimeout
方法的语法如下:
const timerID = setTimeout(fn, delay, arg1, arg2, ...)
fn
— 在给定的延迟时间后要执行的函数。delay
(可选) — 定时器在执行函数之前应该等待的时间(以毫秒为单位)。如果未指定,则使用替换值 0。arg1, arg2, ...argN
(可选) — 给定函数的参数。
setTimeout
方法返回一个整数值,用于标识创建的定时器。这个整数用于清除定时器。
示例
function sayHello () {console.log('Hello')
}setTimeout(sayHello, 2000) // 'Hello'
2秒后,将在控制台打印 'hello'
。
如果这个 sayHello
函数接受参数,我们可以创建:
function sayHello(name) {console.log(`Hello, ${name}`)
}setTimeout(sayHello, 1000, 'IU')
这将在2秒后打印 'Hello,IU'
。
setTimeout
还接受第三个参数,作为 fn
函数的参数:
for (var i = 0; i < 3; i++) {setTimeout(console.log, 1000 * i, i) // 0 1 2
}
它可以巧妙的解决一个闭包问题。通过给 setTimeout
的回调函数传参的方式,保存了每次循环中 i
的值。
clearTimeout
clearTimeout
方法用于取消定时器。例如,我们可能希望在定时器执行函数之前取消它。setTimeout
方法会返回一个 ID
,这个 ID
可以用于取消定时器。
function sayHello(name) {console.log(`Hello, ${name}`)
}const timerID = setTimeout(sayHello, 3000, 'IU')clearTimeout(timerID)
以上示例中,定时器永远不会运行。
setInterval
setInterval
方法用于安排函数在一段时间后重复执行。该方法的语法如下:
const timerID = setInterval(fn, delay, arg1, arg2, ...)
在这种情况下,延迟是定时器应该延迟函数的连续执行的时间(毫秒)。setInterval
方法还返回用于清除定时器的 ID。
示例
function sayHello(name) {console.log(`Hello, ${name}`)
}setInterval(sayHello, 3000, 'IU') // 'IU'
上面的代码将在 3 秒钟后重复打印 'Hello IU'
。
setInterval
的语法与 setTimeout
非常相似。主要区别在于:
setTimeout
方法只在定时器过期后触发一次。setInterval
方法会重复运行函数,除非它被取消。
为了阻止 setInterval
持续运行,我们可以使用 clearInterval
方法。
clearInterval
clearInterval
方法用于停止 setInterval
方法的执行。它接受定时器 ID
作为参数,并使用该 ID
停止定时器。
let counter = 0
function sayHello(name) {console.log(`Hello, ${name}`)counter++if (counter === 3) {clearInterval(timerID)}
}let timerID = setInterval(sayHello, 3000, 'IU')
console.log(1)
sayHello
函数只执行3次。
您可能会想知道 if
语句为什么在函数内部,而不是函数之外,例如:
let counter = 0
function sayHello(name) {console.log(`Hello, ${name}`)counter++
}let timerID = setInterval(sayHello, 3000, 'IU')if (counter === 3) {clearInterval(timerID)
}
此时,我们需要了解 JavaScript 执行 setInterval
和 setTimeout
方法的方式。
非阻塞 I/O 操作
与其他语言不同,JavaScript 有一个执行任务的线程,它逐行执行任务。这意味着一行代码必须在继续下一行之前完成执行。换句话说,JavaScript 代码的执行是阻塞的。
但是,有一些非阻塞 I/O 操作是由底层引擎处理的。例如 AJAX
、setTimeout
和 setInterval
获取数据等操作属于这一类。因此,JavaScript 不会等待传递给 setTimeout
或 setInterval
方法的函数(回调函数)完成执行,然后再转到下一个任务或代码行。
在上面的例子中,如果我们以第二种方式编写,定时器将不会停止运行。这是因为在执行这一行 let timerID = setInterval(sayHello, 3000, 'IU')
之后,JavaScript 立即转到下一个代码块.
if (counter === 3) {clearInterval(timerID)
}
在这一点上,条件不是真的,所以定时器永远不会被清除。这也是为什么在我们的 clearTimeout
示例中,传递给 setTimeout
的回调函数从未被触发的原因。因为 JavaScript 立即转到下一行代码。
http://www.taodudu.cc/news/show-5190223.html
相关文章:
- JavaScript之setTimeout与setInterval的用法与区别
- 【计算机网络】实验一 双绞线水晶头制作
- Word怎样使文档铺满页面充满整页并且插入空格行成巡检表
- Python自动化巡检导出Excel表
- oracle表空间可用性检查,Oracle巡检内容
- oracle ogg巡检,oracle 巡检内容
- 计算机相关设备巡检表,运维常用表格
- Oracle数据库巡检
- mysql数据库巡检
- linux运维常用巡检表格,Linux系统巡检常用命令
- oracle健康巡检脚本,oracle 巡检脚本
- oracle巡,ORACLE巡检表
- 3GPP协议说明
- 3gpp笔记
- 【推荐】车联网英文3GPP Specifications资料合集.zip
- 3GPP 36系列协议
- 如何下载3GPP标准文件
- 3GPP组织
- 最新3GPP协议下载
- 3GPP R17研究项目
- 3GPP
- 3GPP中URLLC标准研究进展
- 3GPP测量事件
- 3GPP协议文档
- 关于3GPP的教程
- 3GPP规范
- 3GPP | 基础
- 老猿学5G扫盲贴:3GPP规范中部分与计费相关的规范序列文档
- 3GPP是干什么的?详解3GPP组织的历史,通信行业必读!
- vue脚手架创建项目失败,显示vue:无法加载文件
JavaScript 中的 setTimeout 和 setInterval 方法相关推荐
- JavaScript中关于setTimeout和setInterval的使用
两个函数都是可以用来实现一段时间后执行一段javascript代码的效果.两个函数都有两个参数,前面的都是执行表达式,后面的是隔的秒数. 不同的是setInterval会每隔指定的时间段就执行一次代码 ...
- javascript requestAnimationFrame 解决 setTimeout、setInterval 时间不准的方法。
javascript requestAnimationFrame 解决 setTimeout.setInterval 时间不准的方法. 取代 setInterval <!DOCTYPE html ...
- php节点对象,JavaScript_JavaScript中访问节点对象的方法有哪些如何使用,JavaScript中访问节点对象的方法 - phpStudy...
JavaScript中访问节点对象的方法有哪些如何使用 JavaScript中访问节点对象的方法有哪些? var obj = document.getElementById('fdafda'); va ...
- 什么是在JavaScript中扩展错误的好方法?
本文翻译自:What's a good way to extend Error in JavaScript? I want to throw some things in my JS code and ...
- 在JavaScript中复制数组的最快方法-切片与“ for”循环
本文翻译自:Fastest way to duplicate an array in JavaScript - slice vs. 'for' loop In order to duplicate a ...
- java中字符串和数组如何比较_[Java教程]javascript中数组和字符串的方法比较
[Java教程]javascript中数组和字符串的方法比较 0 2016-07-19 23:00:05 ×目录[1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的 ...
- JavaScript中的 inludes 和 indexOf 方法 | 判断字符串或数组中是否存在对应的元素| 相同点与不同点 | 代码详解
目录 JavaScript中的inludes和indexOf方法 1.数组中的includes和indexOf方法比较 1.1 函数返回值的不同 1.2 函数第二个参数--开始查找的位置 1.3 in ...
- html escape函数,JavaScript中escape()函数的使用方法
导语:我们在传递参数时,为了避免服务器端出现乱码,常常会要用到编码函数,urlencode.HtmlEncode.base64_encode等.本文给大家详细讲解JavaScript中escape() ...
- javascript中的setTimeout() 方法和clearInterval() 方法和setInterval() 方法
语法 setTimeout(code,millisec) 参数 描述 code 必需.要调用的函数后要执行的 JavaScript 代码串. millisec 必需.在执行代码前需等待的毫秒数. 提示 ...
最新文章
- 递归查询mysql数据库设计
- php回调函数如何执行顺序,PHP回调函数调用方式
- [转帖]IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?...
- 图像处理之双线性插值原理和实现
- 查看虚拟机cpu型号_虚拟机管理器(Virtual Machine Manager)简介 | Linux 中国
- struts中文问题,struts国际化问题的终极解决方案
- 【英语学习】【Level 08】U01 Let's Read L3 The classics are always in
- POJ NOI MATH-7654 等差数列末项计算
- 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_1 搭建环境
- java课程设计(总结)
- Linux账号和权限管理
- MAXWELL软件的初步使用
- 第四届泰迪杯数据挖掘挑战赛B题数据预处理-数据导入(Matlab)
- CSS_19种鼠标指针光标样式
- Linux添加工作组和用户
- 割线法matlab实验报告,牛顿迭代割线法二分法算法实验报告.docx
- 2022京东3.8节如何给不同SKU打水印?
- 怎样使用Markdown输入数学公式
- 数据库学习7 — 嵌套查询
- php ascii过滤,php过滤ascii控制字符
热门文章
- 2021-2027全球与中国草药提取物市场现状及未来发展趋势
- Python——定义一个函数,将列表中的每个值修改为前一个值的两倍(其中,第一个值为0);
- java学习网站分享【转载】
- [专业名词·硬件] 2、DC\DC、LDO电源稳压基本常识(包含基本原理、高效率模块设计、常见问题、基于nRF51822电源管理模块分析等)·长文...
- 「土」秘法地震----二维前缀和
- 基于单片机的烟雾浓度监测报警设计
- w3shool学习1-PHP 语法
- Spring Boot 配置CROS Filter
- 免费三加一php源码,最新微联运微信投票独立版PHP源码|基于31CMS投票系统二次开发+幸运大转盘+独立后台吸粉工具...
- 基于物联网及数字孪生技术的数字农业系统设计与实现