Javascript这个对象在interval / timeouts内

时间:2011-04-12 00:54:36

标签: javascript this setinterval

我有一个大的setInterval语句方法,它需要访问从区间内拥有该方法的对象的 this 对象。我实现了一个简单的闭包,但它看起来并不优雅:

connect: function(to, rate, callback){
    var cthis = this,                             //set cthis to this,
    connectIntervalID = setInterval(function(){
        if(cthis.attemptConnect(to)){             //reference it here,
            clearInterval(connectIntervalID)
            cthis.startListening(10)              //here,
            callback && callback.apply(cthis, []) //and here
        }
    }, rate)
}

如果您想使用 this 而不是 cthis ,您也可以使用 apply 调用来执行此操作

connect: function(to, rate, callback){
    var cthis = this,
    tempFunc = function(){
        if(this.attemptConnect(to)){                 
            clearInterval(connectIntervalID)
            this.startListening(10)              
            callback && callback.apply(this, []) 
         }
     }�       
     connectIntervalID = setInterval(function(){tempFunc.apply(cthis, [])}, rate)
 }

然而,这似乎更糟......

3 个答案:

答案 0 :(得分:2)

使用.bind会让它更好一点(在我看来,您可能会也可能不会同意):

支持代码:

function $A(args){
   var out = [];
   for(var i=0, l=args.length; i<l; i++){ out.push(args[i]); }
   return out;
}

Function.prototype.bind = function() {
   var __method = this, args = $A(arguments), object = args.shift();

   return function() {
      return __method.apply(object || this, args.concat( $A(arguments) ));
   };
};

,您的代码变为:

connect: function(to, rate, callback){
    connectIntervalID = setInterval((function(){
        if(this.attemptConnect(to)){             //reference it here,
            clearInterval(connectIntervalID)
            this.startListening(10)              //here,
            callback && callback.apply(this, []) //and here
        }
    }).bind(this), rate)
}

但我担心你不会好多了。

答案 1 :(得分:0)

您的第一个示例或多或少是执行此操作的标准方法。我唯一的建议是将你的变量称为cthis以外的变量;使其描述被绑定的对象。

Javascript 1.8.5添加了Function.prototype.bind以不同的方式解决这个问题,但对大多数人来说这不是一个有用的解决方案。

答案 2 :(得分:0)

我将setInterval函数分解为自己的函数,并附加到与connect相同的对象。通过这种方式,很明显this指的是同一个对象:

connect: function (to, rate, callback) {
    var obj = this;
    var intervalId = setInterval(function () {
        obj.connectInterval(intervalId, callback);
    }, rate);
},
connectInterval: function (intervalId, callback) {
    if (this.attemptConnect(to)) {
        clearInterval(intervalId);
        this.startListening(10);
        callback && callback.apply(this, []);
    }
}