Javascript:setTimeout在匿名函数表达式上的使用

Javascript:setTimeout在匿名函数表达式上的使用,javascript,settimeout,Javascript,Settimeout,我最近开始学习javascript来帮助维护一些东西,今天遇到了这个问题: this.moveChar = function(){ // body here setTimeout(moveChar,1000); } this.initialise= function(){ this.moveChar(); } 调用initialise时,我希望调用moveChar,然后每1000毫秒重复调用一次 然而,实际发生的是调用moveChar一次,就这样。根据我读到的其他

我最近开始学习javascript来帮助维护一些东西,今天遇到了这个问题:

this.moveChar = function(){  
    // body here
    setTimeout(moveChar,1000);
}

this.initialise= function(){
    this.moveChar();
}
调用initialise时,我希望调用moveChar,然后每1000毫秒重复调用一次

然而,实际发生的是调用moveChar一次,就这样。根据我读到的其他stackoverflow帖子,我怀疑这可能与被表达的函数有关,而不是声明的函数。我试着用

this.moveChar = function recMove(){  
    // body here
    setTimeout(recMove,1000);
}
也没有运气

关于如何解决这个问题有什么建议吗


编辑:我需要做的主要事情是每秒调用一次moveChar函数。如果有比setTimeout递归更好的方法,我愿意接受它

您是否在
侧体
中使用
如果是这样,您应该在调用时绑定正确的上下文

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);
}
或箭头功能:

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);
}

您是否在
侧车身
中使用
如果是这样,您应该在调用时绑定正确的上下文

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);
}
或箭头功能:

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);
}

您可能需要考虑使用<代码> SETIN()/<代码>,这是这个任务的更合适的API。

setInterval()
所做的是-当达到某个间隔时,它将重复调用给定的函数

见:

引用:

重复调用函数或执行代码段,使用固定的 每次呼叫之间的时间延迟。返回一个有效期

示例:

假设
moveChar()
包含您的操作逻辑。然后重复一遍,你要做这一行

let moveChar = function(){  
    // Do stuff
    console.log("Hi thanks for calling me!");
}

setInterval(moveChar, 1000);

您可能需要考虑使用<代码> SETIN()/<代码>,这是这个任务的更合适的API。

setInterval()
所做的是-当达到某个间隔时,它将重复调用给定的函数

见:

引用:

重复调用函数或执行代码段,使用固定的 每次呼叫之间的时间延迟。返回一个有效期

示例:

假设
moveChar()
包含您的操作逻辑。然后重复一遍,你要做这一行

let moveChar = function(){  
    // Do stuff
    console.log("Hi thanks for calling me!");
}

setInterval(moveChar, 1000);

this.moveChar
moveChar
不同,除非
this
是类似于
窗口的全局范围对象


this.moveChar
是对象的属性,而
moveChar
将引用可见范围链中的任何变量

您可以将其更改为几项内容,以保持所使用对象的范围:

使用

使用


this.moveChar
moveChar
不同,除非
this
是类似于
窗口的全局范围对象


this.moveChar
是对象的属性,而
moveChar
将引用可见范围链中的任何变量

您可以将其更改为几项内容,以保持所使用对象的范围:

使用

使用



您是否在侧边
正文中使用
?如果是这样,您应该在调用时绑定正确的上下文。首先,如果您希望在每个特定延迟后运行函数,请使用
setInterval
。第二,当您执行
setTimeout(moveChar,1000)时
,JS将查找名为
moveChar
的变量,但找不到任何内容
moveChar
是对象的一部分,必须作为
object.moveChar
进行访问,在您的例子中
this.moveChar
。现在,由于是递归循环,因此必须再次绑定
。因此,您的代码变为
setTimeout(this.moveChar.bind(this),1000)
yes函数moveChar使用this.VARIABLENAME引用一些全局变量,如果这是您的意思?你能详细说明绑定到上下文部分吗?@Rajesh,
setInterval
完全是另一个特性。使用tail
setTimeout
您永远不会同时接到两个电话。@Rajesh非常感谢您将其完全修复。我之前尝试过setInterval,但它不起作用,可能是因为我没有正确绑定它。您是否在这里的
正文中使用
?如果是这样,您应该在调用时绑定正确的上下文。首先,如果您希望在每个特定延迟后运行函数,请使用
setInterval
。第二,当您执行
setTimeout(moveChar,1000)时
,JS将查找名为
moveChar
的变量,但找不到任何内容
moveChar
是对象的一部分,必须作为
object.moveChar
进行访问,在您的例子中
this.moveChar
。现在,由于是递归循环,因此必须再次绑定
。因此,您的代码变为
setTimeout(this.moveChar.bind(this),1000)
yes函数moveChar使用this.VARIABLENAME引用一些全局变量,如果这是您的意思?你能详细说明绑定到上下文部分吗?@Rajesh,
setInterval
完全是另一个特性。使用tail
setTimeout
您永远不会同时接到两个电话。@Rajesh非常感谢您将其完全修复。我早些时候尝试过setInterval,但它不起作用,可能是因为我没有正确绑定它。他需要重复执行,
setInterval
这里需要。此
setTimeout
重复执行。为什么要在这里使用
setInterval
呢?查看此页面上的第二个提示,查看在同一页面上使用计时事件创建的时钟有区别:
setInterval
不要等待以前的调用,这样它可能会垃圾邮件调用。他需要重复执行,这里需要使用
setInterval
。此
setT