14

「setInterval」で「call」を使用して、オブジェクト リテラルを取得し、独自のメソッドの 1 つを呼び出すにはどうすればよいですか?

これが例です。これは機能し、なぜ機能するのか理解しています。timer オブジェクトは、1 秒ごとに独自の tick メソッドを呼び出します。

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

  },

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

timer.start();

「call」を使用して、このコードを単純化しようとしました。この次の例は、私が思いついた最高のものです。しかし、それは機能しません。tick メソッドは 1 回だけ呼び出され、型エラーが発生します。

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

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

timer.start();

通話の仕組みがよくわからないと思います。誰かが私が間違っていることを説明できますか?

4

2 に答える 2

26

あなたは.calling .setIntervalブラウザが呼び出すコールバック関数ではありません:

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

動作するはずです。見る.bind

于 2012-06-28T09:26:08.700 に答える
2

これは私が最終的に得たものです:

  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();
于 2013-10-26T20:06:44.350 に答える