JavaScript 没有 fat-arrow 函数的 React setInterval
JavaScript React setInterval WITHOUT fat-arrow function
我正在启动 React,我发现我可以使用 setInterval() 中的粗箭头函数设置一个时钟:
class Clock extends React.Component {
constructor(props) {
super(props)
this.state = { date: new Date() }
this.timer = null
}
componentDidMount() {
this.timer = window.setInterval(() => {
this.setState({ date: new Date() })
}, 1000)
}
但我没能用常规函数获得相同的结果(如下)。我认为它与在常规函数内创建新上下文的“this”关键字相关联?我不知道如何解决这个问题:
componentDidMount() {
this.timer = window.setInterval(function() {
this.setState({ date: new Date() })
}, 1000)
}
感谢您的宝贵时间
箭头函数自动绑定父作用域的上下文。但是 regular function
默认情况下不会这样做。为了更改常规函数的上下文,您可以使用 bind
方法,如下例所示。
this.timer = window.setInterval(function() {
this.setState({ date: new Date() })
}.bind(this), 1000)
这不完全是因为为常规函数创建了新的 this
(顺便说一句,不要混淆上下文和 this
)、常规函数的规则和 this
是:
- 在构造函数的情况下是一个新对象
- 在严格模式下的函数调用中未定义
- 当前对象,如果函数作为方法调用
你的情况是第三种,但诀窍在于,当使用setInterval
或setTimeout
时,回调函数作为方法调用,但在全局范围内(this
==window
).
经典的方式是将this
保存在一个变量中。因为该函数可以访问创建它的上下文,所以它会记住这个变量:
var self = this;
this.timer = window.setInterval(function() {
self.setState({ date: new Date() })
}, 1000)
您也可以使用bind
我正在启动 React,我发现我可以使用 setInterval() 中的粗箭头函数设置一个时钟:
class Clock extends React.Component {
constructor(props) {
super(props)
this.state = { date: new Date() }
this.timer = null
}
componentDidMount() {
this.timer = window.setInterval(() => {
this.setState({ date: new Date() })
}, 1000)
}
但我没能用常规函数获得相同的结果(如下)。我认为它与在常规函数内创建新上下文的“this”关键字相关联?我不知道如何解决这个问题:
componentDidMount() {
this.timer = window.setInterval(function() {
this.setState({ date: new Date() })
}, 1000)
}
感谢您的宝贵时间
箭头函数自动绑定父作用域的上下文。但是 regular function
默认情况下不会这样做。为了更改常规函数的上下文,您可以使用 bind
方法,如下例所示。
this.timer = window.setInterval(function() {
this.setState({ date: new Date() })
}.bind(this), 1000)
这不完全是因为为常规函数创建了新的 this
(顺便说一句,不要混淆上下文和 this
)、常规函数的规则和 this
是:
- 在构造函数的情况下是一个新对象
- 在严格模式下的函数调用中未定义
- 当前对象,如果函数作为方法调用
你的情况是第三种,但诀窍在于,当使用setInterval
或setTimeout
时,回调函数作为方法调用,但在全局范围内(this
==window
).
经典的方式是将this
保存在一个变量中。因为该函数可以访问创建它的上下文,所以它会记住这个变量:
var self = this;
this.timer = window.setInterval(function() {
self.setState({ date: new Date() })
}, 1000)
您也可以使用bind