感谢踩过的坑

sf社区的第一篇文章。

最近在做一个拍卖的微信小程序,用到了定时器setTimout和setInterval,简单谈谈这两个api。


  • setTimeout

最常见的用法就是第二种(第三种mdn文档不推荐),如:

var timeoutId = setTimeout(function() {console.log('hello world!')
},1000)

定时器是先等待1000ms再执行function的语句,而不是一开始就执行然后再等待。如果执行的语句需要用到this引用,需要在回调函数function上绑定this:function() {...}.bind(this),把this传给回调函数,同作为该回调函数的this,使回调函数内外this的指向保持一致。或者用es6的箭头函数() => {},也能起到同样的作用。bind的用法详见Function.prototype.bind()

用完定时器之后,要记得清除clearTimeout(timeoutId) 这里的timeoutId是setTimeout返回的一个正整数编号,是定时器的唯一标识符。


  • setInterval

在我看来基本上可以当成setTimeout的升级版,就像setTimeout循环调用自身,用法也跟setTimeout一样,用完是也要记得用clearInterval清掉定时器。底层原理或许会有些不同,这里就不深究。


下面是我在微信小程序倒计时组件:

// components/countdown.js
/*** 倒计时组件*/
Component({/*** 组件的属性列表*/properties: {durationInit: {type: Number,value: 0,observer: function(newVal) {  //监控duration初始值变动(看有没有外部传入新的时间)this.initDuration(newVal)}}},/*** 组件的初始数据*/data: {duration: 0, //剩余时间,单位秒timeDisplay: '' //展示时间},intervalId: null, //计时器Id,不需要渲染,放外面,免得影响性能/*** 组件销毁了要清除计时*/detached() {this.stopInterval(this.intervalId)},/*** 组件的方法列表*/methods: {// 设置时间setTime: function(duration) {if (duration <= 0) {this.setData({timeDisplay: `活动结束啦`})//this.data.timeDisplay = `活动结束啦,戳这里看看好东西~`return false}var s = this.formatTime(duration % 60)var m = this.formatTime(Math.floor(duration / 60) % 60)var h = this.formatTime(Math.floor(duration / 3600) % 24)var d = this.formatTime(Math.floor(duration / 3600 / 24))var time = `${d}:${h}:${m}:${s}`//写入this.setData({timeDisplay: time})return true},//倒计时countDown: function(duration) {//有没有倒计时的必要.第一次展示时间(这个很重要)var canCountDown = this.setTime(duration)if (canCountDown === true) {var intervalId = setInterval(function() {//清除计时器if (this.data.duration <= 0) {this.stopInterval(intervalId)}this.setData({duration: this.data.duration - 1})this.setTime(this.data.duration)}.bind(this),1000)this.intervalId = intervalId}},//初始化剩余时间initDuration: function(newVal) {if (this.intervalId) {//若有计时器,清除this.stopInterval(this.intervalId)}this.setData({duration: this.data.durationInit})this.countDown(newVal)},//清除计时器stopInterval: function(intervalId) {if (intervalId != null) {clearInterval(intervalId)this.intervalId = null}},//格式化时间formatTime(time) {return time < 10 ? `0${time}` : `${time}`}}
})

最后想吐槽一下W3School,随着学习的深入,发现W3School的坑真多,强烈建议不要看W3School学前端,要看MDN文档。可能很多人的前端启蒙就是W3School,我也是。名字跟W3C很像,还以为是非常专业的网站,然而后来发现跟W3C并没有什么关系。W3School在baidu搜索排名非常高,被坑了,baidu也是同谋。现在早已拥抱google,清爽!
下面就拿setInterval的说明做例子,对比一下MDN和W3School,就知道后者有多坑了。

通过上面3张图片,可以看出
1. W3School含糊其辞,解释不清楚,不详细。用的时候容易出问题
W3School:周期性执行...请告诉我如果先执行了回调函数,再等待1秒,再执行回调函数,这算不算得上周期性??
MDN:详细指出函数的每次调用会在该延迟之后发生

2. 不推荐的用法没有指出,文档更新慢,权威性极低
W3School:连举的例子都是不推荐的用法,用code代码串。。。
MDN:详细指出使用code不推荐,不仅如此,还发散性指出原因和eval()一样,真的很贴心很友好了


以上图片均来源于MDN和W3School

在最后,感谢踩过的坑,让我成长!初来乍到,多多关照,希望能坚持写技术博文。

简单谈谈setTimeout与setInterval相关推荐

  1. 微信小程序setinterval_简单谈谈setTimeout与setInterval

    感谢踩过的坑 sf社区的第一篇文章. 最近在做一个拍卖的微信小程序,用到了定时器setTimout和setInterval,简单谈谈这两个api. setTimeout 最常见的用法就是第二种(第三种 ...

  2. 定时器setTimeout和setInterval的简单应用

    本文简单利用定时器setTimeout和setInterval举了两个小栗子:定时炸弹和1-100递增 代码如下: <!DOCTYPE html> <html lang=" ...

  3. setTimeout和setInterval实现定时器的区别

    这两个方法都能够用来实现在一个固定时间段之后去运行JavaScript.只是两者各有各的应用场景. 方 法 实际上,setTimeout和setInterval的语法相同.它们都有两个参数,一个是将要 ...

  4. setTimeout和setInterval的使用

    (节选自JavaScript精粹) 这两个方法都可以用来实现在一个固定时间段之后去执行JavaScript.不过两者各有各的应用场景. 方 法 实际上,setTimeout和setInterval的语 ...

  5. JavaScript———从setTimeout与setInterval到AJAX异步

    setTimeout与setInterval执行 首先我们看一下以下代码打印结果 1 2 3 4 5 6 7 console.log(1); setTimeout(function() { conso ...

  6. setTimeout和setInterval你真的了解吗?

    setTimeout和setInterval这两个函数, 大家肯定都不陌生, 但可能并不是每个用过这两个方法的同学, 都了解其内部的实质, 甚至可能会错误的把两个实现定时调用的函数理解成了类似thre ...

  7. js中setTimeout的用法和JS计时器setTimeout与setInterval方法的区别和confirm方法

    setTimeout()在js类中的使用方法 setTimeout (表达式,延时时间) setTimeout(表达式,交互时间) 延时时间/交互时间是以豪秒为单位的(1000ms=1s) setTi ...

  8. setTimeout 和 setInterval

    由于 JavaScript 是异步的,可以使用 setTimeout 和 setInterval 来计划执行函数. 注意: 定时处理不是ECMAScript 的标准,它们在DOM (文档对象模型) 被 ...

  9. 链式调用setTimeout()与setInterval()的区别

    使用 setTimeout()和 setInterval()创建的定时器可以用于实现有趣且有用的功能.执行时机是不能保证的,因为在页面的生命周期中,不同时间可能有其他代码在控制 JavaScript ...

最新文章

  1. topcoder srm 490 div1
  2. 【Hibernate】Hibernate中查询表名、字段名以及字段类型等信息
  3. 2008至今,Chrome如何成长为霸主
  4. mysql操作json优点和缺点_SQL-mysql操作json
  5. python3urllib常见使用_Python3 urllib常用操作
  6. 红帽子RedHat Linux 9.0
  7. 谷歌为什登不上去github_8个月,从中年Web前端到亚马逊百万年薪软件工程师:GitHub最励志计算机自学教程!...
  8. Goodfellow说,聊失败才不是在秀优越...
  9. 利用UrlRewrite,asp.net动态生成htm页面
  10. 区块链 solidity 快排
  11. Python数据分析实战(1)数据分析概述
  12. opencv学习笔记(一) 环境配置/打开一张图片/github(git)初探
  13. android 工具 拓扑图,GitHub - AndroidHelper/graph.editor: HTML5拓扑图编辑器
  14. 【已解决】找不到某服务器 IP 地址
  15. Android 第三方应用接入微信平台(1)
  16. Java项目安全问题及解决方案
  17. vue搜索关键字高亮
  18. date类型的时间转换成年月日格式
  19. 【安全科普】揭秘IPS之网络攻击的“字典”
  20. java中的失败重试机制总结

热门文章

  1. Codeforces Round #361(div 2)
  2. JQuery 操作 radio 被坑一例
  3. 技术要求→物理安全→防盗窃和防破坏
  4. 为什么微软要推 ADO.NET Data Services
  5. Ruby Variable Scope 简单讲解
  6. 求n的阶乘的算法框图_算法|从阶乘计算看递归算法
  7. e5cc温控仪通讯参数设定_产品介绍||DeltaWiFi通讯型多功能电表DPMC520W
  8. 图片句柄_PC微信逆向:自动保存加密的聊天图片
  9. linux 基础训练,Linux 基础训练习题
  10. 大数据技术之 Kafka (第 1 章 Kafka 概述)