我最近开始学习javascript来帮助维护一些东西并且今天遇到了这个问题:
this.moveChar = function(){
// body here
setTimeout(moveChar,1000);
}
this.initialise= function(){
this.moveChar();
}
当调用初始化时,我预计会调用moveChar,然后每1000ms重复调用一次
然而,实际发生的是moveChar被调用一次然后就是这样。基于我读过的其他stackoverflow帖子,我怀疑它可能与表达的函数有关,而不是声明。我试过用
this.moveChar = function recMove(){
// body here
setTimeout(recMove,1000);
}
没有运气。
有关如何解决此问题的任何建议?
编辑:我需要做的主要是每秒调用一次moveChar函数。如果有一个比setTimeout递归更好的方法,我会对它开放
答案 0 :(得分:3)
this.moveChar
与moveChar
不同,除非this
是全局范围对象,如window
。
this.moveChar
是对象的属性,而moveChar
将引用可见范围链中的任何变量。
您可以将其更改为一些内容,以保持正在使用的对象的范围:
this.moveChar = function(){
// body here
setTimeout(()=>this.moveChar(),1000);
}
使用.bind()
this.moveChar = function(){
// body here
setTimeout(this.moveChar.bind(this),1000);
}
答案 1 :(得分:1)
您是否在this
使用side body
?
如果是这样,您应该在调用时绑定正确的上下文。
this.moveChar = function(){
// body here
setTimeout(this.moveChar.bind(this), 1000);
}
或使用匿名函数:
this.moveChar = function(){
// body here
var that = this;
setTimeout(function(){
that.moveChar();
}, 1000);
}
或箭头功能:
this.moveChar = function(){
// body here
setTimeout(() => this.moveChar(), 1000);
}
相同的注释适用于setInterval
变体:
this.initialise= function(){
setInterval(this.moveChar.bind(this), 1000);
// var that = this;
// setInterval(function(){that.moveChar();}, 1000);
// setInterval(() => this.moveChar(), 1000);
}
答案 2 :(得分:1)
您可能需要考虑使用setInterval()
,这是此任务更合适的API。
setInterval()
的作用是 - 它会在达到一定的时间间隔后重复调用给定的函数。
请参阅: https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval
<强>引用:强>
重复调用函数或执行带有修复的代码片段 每次通话之间的时间延迟。返回intervalID。
示例:强>
假设moveChar()
包含您的操作逻辑。然后再重复一遍,你将完成这一行。
let moveChar = function(){
// Do stuff
console.log("Hi thanks for calling me!");
}
setInterval(moveChar, 1000);
答案 3 :(得分:-2)
this.moveChar = function(){
// body here
alert('called moveChar');
}
this.initialise= function(){
setInterval(function(){moveChar();},1000);
}
this.initialise();//call here