使用 setInterval 调用的 Javascript 绑定

Posted

技术标签:

【中文标题】使用 setInterval 调用的 Javascript 绑定【英文标题】:Javascript binding using call with setInterval 【发布时间】:2012-06-29 19:03:24 【问题描述】:

如何使用“call”和“setInterval”来获取对象字面量来调用它自己的方法之一?

这是一个例子。 这有效,我理解它为什么有效。 定时器对象每秒调用一次自己的tick方法

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

  ,

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

timer.start();

我尝试通过使用“调用”来简化此代码。 下一个例子是我想出的最好的例子。 但它不起作用:tick 方法只调用了一次,然后我得到一个类型错误。

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

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

timer.start();

我想我真的不明白 call 是如何工作的。 谁能解释我做错了什么?

【问题讨论】:

参考这个***.com/questions/6112330/… 【参考方案1】:

你是.calling.setInterval不是浏览器调用的回调函数:

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

应该可以。见.bind

【讨论】:

使用 Safari 5.1.5 这给了我“TypeError: undefined is not a function”。 Firefox 8.0.1 给了我“未捕获的异常:对 WrappedNative 原型对象的非法操作。” @user1282216 查看链接。我假设开发人员不会使用过时的软件进行开发,但显然我错了:P。 firefox 的错误很有趣,你能给我一个 jsfiddle 吗? @user1282216 没关系,我可以在 Firefox 13 中重现该错误,你做错了。使用代码setInterval( this.tick.bind(this), 1000) 而不是setInterval.call( this )(这会导致错误) 你知道如何添加一些参数到我的方法(tick)吗??谢谢我在尝试这个:setInterval(this.tick("arg_1").bind(this), 1000) ;【参考方案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();

【讨论】:

以上是关于使用 setInterval 调用的 Javascript 绑定的主要内容,如果未能解决你的问题,请参考以下文章

在 setInterval 中调用 clearInterval() 不会停止 setinterval

使用 SetInterval() 调用 Javascript 对象方法

使用setInterval设置多少秒重新发送验证码

使用setInterval设置多少秒重新发送验证码

js中使用setInterval方法只调用一次而没有循环调用

setInterval函数使用方法及小例