setInterval中的引用成员函数

时间:2012-12-02 08:17:01

标签: javascript backbone.js closures

我有一个看起来像这样的骨干模型:

var myModel = Backbone.Model.extend({
    watch : function() {
        this.watcher = setInterval("this.refetch", 5000);
    }

    refetch : function() {
        //do something
    }
});

setInterval方法实际上不起作用,因为我认为this.refetchsetInterval调用中无效。 setInterval("refetch", 5000);也不起作用。

我现在正在做的是:

watch : function() {
    var that = this;
    setInterval(function(){
        that.refetch();
    }, 5000);   
}

有没有更好的方法来执行此操作,因此我不需要使用that

3 个答案:

答案 0 :(得分:3)

由于Backbone已经带了underscore.js,所以请使用它。在您的情况下,上下文可以与_.bind

绑定到区间函数
setInterval( _.bind( function(){this.refetch();}, this), 5000);

这是更好的方法,不仅因为它更短,而且还因为它阻止了that别名在嵌套作用域中可见,这可能导致各种难以捕获的错误。请参阅idiomatic.js样式指南,“Faces of this”部分:https://github.com/rwldrn/idiomatic.js/

答案 1 :(得分:2)

我认为你现在在做什么,即

 function() {
var that = this;
setInterval(function(){
    that.refetch();
}, 5000);   
}

本身就是一种更好的方法。!!

答案 2 :(得分:1)

你的间隔内不存在

this。如果你需要访问任何this,你需要将它传递给闭包中的匿名函数,如下所示:

setInternval( (
  return function(obj){
     obj.refetch();
  }(this)

) , 5000)