Почему мой код в setTimeout не работает в JavaScript?

Мой метод, Chomp.prototype.animate Не работает должным образом. Мой код работает, когда функция не применяется Chomp.prototype.playerMove,

когда Chomp.prototype.playerMove применяется заявление if, включающее counter до того, как addEventListener может иногда выполнить addEventListener, даже если counter больше единицы, тогда он выполняет функцию в addEventListener много раз, в зависимости от того, как долго выполнялся код до его выполнения. В те времена он не должен был выполнять addEventListener, и если он это сделал, то счетчик должен быть добавлен к более чем одному, а затем не выполняться снова. Счетчик был добавлен более чем к одному, даже в эти моменты выполнения addEventListener несколько раз.

Даже незнакомец, когда у меня есть Chomp.prototype.animate всегда установлен counter 1 вместо 0, он все равно выполнит оператор if, который говорит if (counter < 1) один раз. Кроме того, когда 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 ответ

Вы применяете yellow контекст при вызове Chomp.prototype.animate, yellow, который является примером Chomp, будет связан с this когда вы находитесь внутри Chomp.prototype.animate декларация, что означает, что все ваши привязки к this теперь привязаны к экземпляру Chomp yellowи не Chomp.prototype объект. Я не совсем уверен, почему вы используете Chomp.prototype вызывать все ваши методы в методах-прототипах, если вы планируете использовать их с экземплярами Chomp и не Chomp.prototype (это два разных объекта!). Это может иметь больше смысла в использовании this во всех ваших Chomp.prototype методы.

Было бы необходимо увидеть остальную часть кода, потому что ваш прототип создает массу побочных эффектов в других методах, для которых вы только что показали /* etc... */, и я не уверен, какую логику эти побочные эффекты вызывают в вашей программе... Опубликуйте больше кода или пишите мне, и мы вместе сможем поработать над рефакторингом, чтобы избежать этих проблем. ура

PS хотел опубликовать это как комментарий, но это слишком долго

Другие вопросы по тегам