setInterval中this

  今天使用react做钟表,自然用到了setInterval,但是出现this指向不明的问题。

 1 <html>
 2 <head>
 3 <meta charset="UTF-8" />
 4 <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
 5 <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
 6 <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
 7 </head>
 8 <body>
 9
10 <div id="example"></div>
11 <script type="text/babel">
12 class Clock extends React.Component {
13   constructor(props) {
14     super(props);
15     this.state = {date: new Date()};
16   }
17
18   componentDidMount() {
19     this.timerID = setInterval(
20       () => this.tick(),
21       1000
22     );
23   }
24
25   componentWillUnmount() {
26     clearInterval(this.timerID);
27   }
28
29   tick() {
30     this.setState({
31       date: new Date()
32     });
33   }
34
35   render() {
36     return (
37       <div>
38         <h1>Hello, world!</h1>
39         <h2>现在是 {this.state.date.toLocaleTimeString()}.</h2>
40       </div>
41     );
42   }
43 }
44
45 ReactDOM.render(
46   <Clock />,
47   document.getElementById(‘example‘)
48 );
49 </script>
50
51 </body>
52 </html>

  在componentDidMount中setInterval使用了ES6的箭头函数,有建议可以使用ES6以前的函数是这样

1 let that = this;
2 this.timerID = setInterval(function () {
3   return that.tick();
4 },1000);

  这样使可以的,但是过于繁琐,观察了一下,setInterval第一个参数不就是传一个函数就行嘛,干嘛这么费劲,于是我这样写

1 this.timerID = setInterval(
2   this.tick,
3 1000);

  结果报错了

  什么?找不到setState,那就是this不对啊,果然setInterval中第一个参数若果是一个裸函数的话,函数中this指向的是window。

  于是改为

1 this.timerID = setInterval(
2   this.tick.bind(this),
3 1000);

  完美运行!

原文地址:https://www.cnblogs.com/guanghe/p/10711032.html

时间: 2024-10-11 14:36:19

setInterval中this的相关文章

js中clearInterval无效,以及setInterval中断后重新执行

引言: 网页中的效果:网页上向右运动的span,背景图片随着向右移动而不断切换.在鼠标移入图片时,停止向右运动,并改变为特定的背景图片:当鼠标移出时,继续向右移动并不断切换背景图片,直到运动到右端停止运动及图片切换.向右运动以及图片切换效果均是由setInterval周期性调用函数实现,停止运动则需要clearInterval函数实现. 在实现过程中容易出现以下问题: 鼠标移入时不能停止运动,或者是移动速度加快,clearInterval无效:鼠标移出后,运动到最右端不能停止,clearInte

定时器setTimeout/setInterval中变量报错:not defined 的解决方法

首先声明本人资质尚浅,如有错误,欢迎指正.共同提高. ----------------------------------------------------------------------------------- 首先声明:本文不重点讨论this作用域,而是讨论普通变量在定时器中容易报错的情况: setTimeout的基本用法不再重述, 详见:http://www.w3school.com.cn/htmldom/met_win_settimeout.asp bug: setTimeout

关于setInterval和setTImeout中的this指向问题

前些天在练习写一个小例子的时候用到了定时器,发现在setInterval和setTimeout中传入函数时,函数中的this会指向window对象,如下例: var num = 0; function Obj (){ this.num = 1, this.getNum = function(){ console.log(this.num); }, this.getNumLater = function(){ setTimeout(function(){ console.log(this.num)

JavaScript中的该如何[更好的]做动效

在用js写动画的时候,无非使用 setTimeout/setInterval 或者 requestAnimationFrame 来处理动画(在jquery的代码里也是这么干的),本文主要为了记录下两者的区别及使用两者来实现动过程. 以实现一个简单的滚动到顶部为例 setInterval setInterval() 方法重复调用一个函数或执行一个代码段,在每次调用之间具有固定的时间延迟.返回一个intervalID,可用于 cancelInterval 达到结束循环的效果. setTimeout

如何用setInterval调用类的方法

setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式.setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭.由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数. 近日在编写程序时发现调用setInterval传入的方法时,在程序间隔调用时无法获取正确的类方法,究其原因是由于JS灵活的this指针重绑定导致的.那么this指针为什么会重绑定,又重绑定到哪里去了呢?se

你可能不知道的setInterval的坑

之前印象中一直记得setInterval有一些坑,但是一直不是很清楚那些坑是什么.今天去摸索了下之后,决定来做个记录以免自己忘记,也希望让更多人了解到这个坑. setInterval会无视代码的错误.就算遇到了错误,它还是会一直循环下去,不会停止.这就导致了可能你代码里存在着一些问题(比如你的代码可能有个一定概率下会发生的错误,而你使用setinterval来循环调用它,由于setinterval不会因为报错停止,所以这个问题可能被隐藏),可是却很难发现. let count = 1; setI

js的事件循环机制:同步与异步任务(setTimeout,setInterval)宏任务,微任务(Promise,process.nextTick)

javascript是单线程,一切javascript版的"多线程"都是用单线程模拟出来的,通过事件循环(event loop)实现的异步. javascript事件循环 事件循环中的同步任务,异步任务: 同步和异步任务在不同的执行"场所",同步的进入主线程,异步的进入Event Table执行并注册函数. 当指定的异步事情完成时,Event Table会将这个函数移入Event Queue. 主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,推

js笔试题系列之三——函数

在这一章以函数为主的讲解中,也会不可避免的牵涉到数组和对象的内容,这也不难理解,知识往后走牵涉的内容自然也越多. (1)经典作用域问题 题一: var a = 0 function f(){ console.log(a); ==>undefined var a = 2; console.log(a); ==>2 } f() 第二次日志输出结果相对容易理解,关键是第一次打印结果并不是全局变量中的a,因为按照作用域链的查找规则,在函数执行的时候会先查找局部作用域,而此时局部作用域已经存在变量a,只

js之定时器

一.通过定时器我们可以间隔设定时间重复调用某个函数,利用这个特性,我们可以做很多事,例如,12306上的每间隔5秒查询自动查询一次余票,简单动画的实现等等 二.定时器的格式: 定时器有两种格式,分别是setInterval(func, time) 和 setTimeout(func, time),这两个有一些区别 1.setInterval(func, tine); (1). 此定时器操作是这样的,解释到该语句时,是要间隔time时间后第一次执行func函数,间隔time时间后再次执行func函