有时您不希望函数立即运行。您希望它重新执行,甚至在特定时间间隔后重复运行。JavaScript 为我们提供了两种实现方法: setTimeoutsetInterval。下面,我们将来理解这两个方法。

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 执行 setIntervalsetTimeout 方法的方式。

非阻塞 I/O 操作

与其他语言不同,JavaScript 有一个执行任务的线程,它逐行执行任务。这意味着一行代码必须在继续下一行之前完成执行。换句话说,JavaScript 代码的执行是阻塞的。

但是,有一些非阻塞 I/O 操作是由底层引擎处理的。例如 AJAXsetTimeoutsetInterval 获取数据等操作属于这一类。因此,JavaScript 不会等待传递给 setTimeoutsetInterval 方法的函数(回调函数)完成执行,然后再转到下一个任务或代码行。

在上面的例子中,如果我们以第二种方式编写,定时器将不会停止运行。这是因为在执行这一行 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 方法相关推荐

  1. JavaScript中关于setTimeout和setInterval的使用

    两个函数都是可以用来实现一段时间后执行一段javascript代码的效果.两个函数都有两个参数,前面的都是执行表达式,后面的是隔的秒数. 不同的是setInterval会每隔指定的时间段就执行一次代码 ...

  2. javascript requestAnimationFrame 解决 setTimeout、setInterval 时间不准的方法。

    javascript requestAnimationFrame 解决 setTimeout.setInterval 时间不准的方法. 取代 setInterval <!DOCTYPE html ...

  3. php节点对象,JavaScript_JavaScript中访问节点对象的方法有哪些如何使用,JavaScript中访问节点对象的方法 - phpStudy...

    JavaScript中访问节点对象的方法有哪些如何使用 JavaScript中访问节点对象的方法有哪些? var obj = document.getElementById('fdafda'); va ...

  4. 什么是在JavaScript中扩展错误的好方法?

    本文翻译自:What's a good way to extend Error in JavaScript? I want to throw some things in my JS code and ...

  5. 在JavaScript中复制数组的最快方法-切片与“ for”循环

    本文翻译自:Fastest way to duplicate an array in JavaScript - slice vs. 'for' loop In order to duplicate a ...

  6. java中字符串和数组如何比较_[Java教程]javascript中数组和字符串的方法比较

    [Java教程]javascript中数组和字符串的方法比较 0 2016-07-19 23:00:05 ×目录[1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的 ...

  7. JavaScript中的 inludes 和 indexOf 方法 | 判断字符串或数组中是否存在对应的元素| 相同点与不同点 | 代码详解

    目录 JavaScript中的inludes和indexOf方法 1.数组中的includes和indexOf方法比较 1.1 函数返回值的不同 1.2 函数第二个参数--开始查找的位置 1.3 in ...

  8. html escape函数,JavaScript中escape()函数的使用方法

    导语:我们在传递参数时,为了避免服务器端出现乱码,常常会要用到编码函数,urlencode.HtmlEncode.base64_encode等.本文给大家详细讲解JavaScript中escape() ...

  9. javascript中的setTimeout() 方法和clearInterval() 方法和setInterval() 方法

    语法 setTimeout(code,millisec) 参数 描述 code 必需.要调用的函数后要执行的 JavaScript 代码串. millisec 必需.在执行代码前需等待的毫秒数. 提示 ...

最新文章

  1. 递归查询mysql数据库设计
  2. php回调函数如何执行顺序,PHP回调函数调用方式
  3. [转帖]IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?...
  4. 图像处理之双线性插值原理和实现
  5. 查看虚拟机cpu型号_虚拟机管理器(Virtual Machine Manager)简介 | Linux 中国
  6. struts中文问题,struts国际化问题的终极解决方案
  7. 【英语学习】【Level 08】U01 Let's Read L3 The classics are always in
  8. POJ NOI MATH-7654 等差数列末项计算
  9. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_1 搭建环境
  10. java课程设计(总结)
  11. Linux账号和权限管理
  12. MAXWELL软件的初步使用
  13. 第四届泰迪杯数据挖掘挑战赛B题数据预处理-数据导入(Matlab)
  14. CSS_19种鼠标指针光标样式
  15. Linux添加工作组和用户
  16. 割线法matlab实验报告,牛顿迭代割线法二分法算法实验报告.docx
  17. 2022京东3.8节如何给不同SKU打水印?
  18. 怎样使用Markdown输入数学公式
  19. 数据库学习7 — 嵌套查询
  20. php ascii过滤,php过滤ascii控制字符

热门文章

  1. 2021-2027全球与中国草药提取物市场现状及未来发展趋势
  2. Python——定义一个函数,将列表中的每个值修改为前一个值的两倍(其中,第一个值为0);
  3. java学习网站分享【转载】
  4. [专业名词·硬件] 2、DC\DC、LDO电源稳压基本常识(包含基本原理、高效率模块设计、常见问题、基于nRF51822电源管理模块分析等)·长文...
  5. 「土」秘法地震----二维前缀和
  6. 基于单片机的烟雾浓度监测报警设计
  7. w3shool学习1-PHP 语法
  8. Spring Boot 配置CROS Filter
  9. 免费三加一php源码,最新微联运微信投票独立版PHP源码|基于31CMS投票系统二次开发+幸运大转盘+独立后台吸粉工具...
  10. 基于物联网及数字孪生技术的数字农业系统设计与实现