为什么setTimeout中的代码无法在JavaScript中运行?

时间:2015-01-01 22:21:36

标签: javascript event-handling call

我的方法,Chomp.prototype.animate无效。当函数不适用Chomp.prototype.playerMove时,我的代码可以正常工作。

当应用Chomp.prototype.playerMove时,在addEventListener之前涉及counter的if语句有时可以执行addEventListener,即使counter大于1,那么它执行函数的时间也是如此addEventListener多次,具体取决于代码在执行之前的运行时间。那些时候,它不应该执行addEventListener,如果确实如此,那么应该将counter添加到多个,然后不再执行。计数器被添加到多个,即使在多次执行addEventListener的这些时间。

更奇怪的是,当Chomp.prototype.animate总是将counter设置为1而不是0时,它仍然会执行一次if (counter < 1)的if语句。此外,当应用Chomp.prototype.playerMove时,Chomp.prototype.chomping无法正常工作。 (它没有Chomp.prototype.playerMove)。这很奇怪,我不明白这个问题。

如果我的代码的某个部分有请求,那么我可以发布,但我的完整代码可能并不是对这个问题都有用。

var counter = 0;
var rotation;
var Chomp = function(x, y) {
  /*many properties*/
}
Chomp.prototype.chomping = function() {
  /*properties and conditions, etc.*/
}
Chomp.prototype.animate = function() {
  var that = this;
  Chomp.prototype.chomping.apply(this);
  Chomp.prototype.playerMove.apply(this);
  //counter = 1;
  counter = 0;
  setTimeout(function(){
    Chomp.prototype.animate.apply(that);
  }, 100);
}
Chomp.prototype.playerMove = function() {
  var that = this;
  /*values*/
  var yNew = 0, xNew = 0, rotate = "";
  var once = function(event) {
    /*conditions for keys, etc.*/
    Chomp.prototype.move.call(that, xNew, yNew, rotate);
    /*values*/
    removeEventListener("keydown", once);
  }
  if (counter < 1)
    addEventListener("keydown", once); 
  /*more code*/
  }
Chomp.prototype.move = function(xNew, yNew, rotate) {
  var that = this;
  counter += 1;
  /*loops, conditions, etc.*/
var yellow = new Chomp(30, 60);
Chomp.prototype.animate.apply(yellow);

提前致谢! :)

1 个答案:

答案 0 :(得分:0)

您在调用yellow时应用Chomp.prototype.animate上下文。当您在yellow声明中时,Chompthis的实例将绑定到Chomp.prototype.animate,这意味着您对{{1}的所有绑定现在绑定到Chomp实例this,而不是yellow对象。我不确定为什么你使用Chomp.prototype来调用原型方法中的所有方法,如果你计划将它们用于Chomp.prototype而不是Chomp的实例(它们是两个)不同的对象!)。在所有Chomp.prototype方法中使用this可能更有意义。

有必要查看剩下的代码,因为你的原型在你刚刚展示Chomp.prototype的其他方法中产生了大量的副作用,我不确定这些副作用的逻辑是什么在您的程序中触发...发布更多代码或PM我,我们可以一起工作在一个重构,以避免这些问题。干杯

P.S。我希望将此作为评论发布,但它太长了