Привязка Javascript с использованием вызова с setInterval

Как я могу использовать «вызов» с «setInterval», чтобы литерал объекта вызывал один из его собственных методов?

Вот пример. Это работает, и я понимаю, почему это работает. Объект таймера вызывает собственный метод тика каждую секунду.

var timer =
{ 
  start: function()
  {
    var self = this;
    setInterval(function(){self.tick();}, 1000);

  },

  tick: function()
  {
    console.log("tick!");
  }
};

timer.start();

Я попытался упростить этот код, используя «вызов». Следующий пример — лучшее, что я придумал. Но это не работает: метод тика вызывается только один раз, и тогда я получаю ошибку типа.

var timer =
{ 
  start: function()
  {
    setTimeout.call(this, this.tick(), 1000);
  },

  tick: function()
  {
    console.log("tick!");
  }
};

timer.start();

Кажется, я не совсем понимаю, как работает вызов. Кто-нибудь может объяснить, что я делаю неправильно?


person d13    schedule 28.06.2012    source источник
comment
обратитесь к этому stackoverflow.com/questions/6112330/   -  person Umesh Aawte    schedule 28.06.2012


Ответы (2)


Вы .calling .setInterval не являетесь своей функцией обратного вызова, которую вызывает браузер:

setInterval( this.tick.bind(this), 1000 );

Должно сработать. См. .bind.

person Esailija    schedule 28.06.2012
comment
В Safari 5.1.5 это дает мне TypeError: undefined не является функцией. Firefox 8.0.1 дает мне неперехваченное исключение: недопустимая операция с объектом-прототипом WrappedNative. - person d13; 28.06.2012
comment
@user1282216 смотрите ссылку. Я предполагаю, что разработчики не используют устаревшее программное обеспечение для разработки, но, видимо, я ошибался: P. Ошибка Firefox интересна, можете ли вы дать мне jsfiddle по этому поводу? - person Esailija; 28.06.2012
comment
@user1282216 user1282216 неважно, я могу воспроизвести эту ошибку в firefox 13, вы делаете это неправильно. Используйте код setInterval( this.tick.bind(this), 1000) вместо setInterval.call( this ) (это вызывает ошибку) - person Esailija; 28.06.2012
comment
Знаете ли вы, как я могу добавить какой-нибудь аргумент к моему методу (tick)??, спасибо, я попробовал это: setInterval(this.tick(arg_1).bind(this), 1000); - person Alberto Acuña; 18.01.2016

Вот что у меня получилось:

  var timer = {
    time: 0,
    start: function() {
      var timerTick = this.tick.bind(this);
      window.setInterval(function() {
        timerTick();
      }, 1000);
    },
    tick: function() {
      this.time += 1;
      console.log(this.time);
    }
  };

  timer.start();
person d13    schedule 26.10.2013