Почему setInterval не работает с созданным мной методом объекта? - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь создать простую анимацию, которая делает изображение автомобиля максимально на экране (упражнение на обучение).Я пытаюсь заставить это случиться с setInterval, и это, кажется, не работает.Изображение является стационарным.См. Код ниже:

var Car = function(x, y) {
  this.x = x;
  this.y = y;
};

Car.prototype.draw = function() {
  var carHtml = '<img src="http://nostarch.com/images/car.png">';

Car.prototype.moveRight = function(distance) {
  this.x;

  this.carElement.css({
    left: distance,
    top: this.y
  });
};

var tesla = new Car(20, 20);
tesla.draw();

function runOnInterval(fn, arg) {
  setInterval(function () {
    fn(arg);
  }, 1000);
}

runOnInterval(tesla.moveRight(), 10);

Как я уже сказал, это приводит к тому, что изображение остается неподвижным, и в консоли появляется сообщение об ошибке с сообщением «fn не является функцией».Может кто-нибудь сказать мне, что мне здесь не хватает?Спасибо.

1 Ответ

0 голосов
/ 31 мая 2018

Аргументы оцениваются с нетерпением.Если у вас есть foo(bar()), то сначала вызывается bar, и его возвращаемое значение передается в foo.

Вот что происходит в

runOnInterval(tesla.moveRight(), 10);

. Он вызывает tesla.moveRight() и передаетвозвращаемое значение (undefined) - runOnInterval, которое затем приведет к ошибке, поскольку undefined не является функцией.

Вы должны передать tesla.moveRight себе и , если необходимопривязать его значение this к правильному объекту:

runOnInterval(tesla.moveRight.bind(tesla), 10);
// or
runOnInterval(function(x) { tesla.moveRight(x); }, 10);

См. также:

...