尝试在TypeScript中创建一个计时器循环:
timeout() {
setTimeout(function () {
console.log('Test');
this.timeout();
}, 1000/60);
}
但是在第一个循环正常工作后我得到了这个错误:“未捕获TypeError:this.timeout不是函数”。看起来这个变量在初始循环后不存在。有什么想法吗?
答案 0 :(得分:21)
因为this
没有引用该对象。每个功能都有自己的功能。因此,this
是由setTimeout()
内的匿名函数定义的this
。
要使您的程序正常工作,您需要在超时前保持class Test {
timeout() {
var that = this;
setTimeout(function () {
console.log('Test');
that.timeout();
}, 1000/60);
}
}
let t = new Test();
t.timeout();
并使用该变量。
lambda functions
或者您可以使用this
,这会将Lamda
保留在您的对象上。this
的{{1}}将引用外部的this
,它调用lambda函数。
class Test {
timeout() {
setTimeout(() => {
console.log('Test');
this.timeout();
}, 1000/60);
}
}
let t = new Test();
t.timeout();
答案 1 :(得分:9)
因为这种情况丢失了。使用箭头功能这是更好的。
timeout() {
setTimeout(() => {
console.log('Test');
this.timeout();
}, 1000/60);
}