Javascript:setTimeout用于匿名函数表达式

时间:2016-07-19 07:12:22

标签: javascript settimeout

我最近开始学习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递归更好的方法,我会对它开放

4 个答案:

答案 0 :(得分:3)

this.moveCharmoveChar不同,除非this是全局范围对象,如window

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

您可以将其更改为一些内容,以保持正在使用的对象的范围:

使用arrow function

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