码迷,mamicode.com
首页 > 其他好文 > 详细

setInterval中this

时间:2019-04-15 16:25:34      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:utf-8   span   height   建议   找不到   har   code   amp   html   

  今天使用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);

  完美运行!

setInterval中this

标签:utf-8   span   height   建议   找不到   har   code   amp   html   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!