Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript在间隔/超时内创建此对象_Javascript_This_Setinterval - Fatal编程技术网

Javascript在间隔/超时内创建此对象

Javascript在间隔/超时内创建此对象,javascript,this,setinterval,Javascript,This,Setinterval,我有一个方法是一个大的setInterval语句,它需要从区间内访问拥有该方法的对象的this对象。我实现了一个简单的闭包,但它似乎不是很优雅: connect: function(to, rate, callback){ var cthis = this, //set cthis to this, connectIntervalID = setInterval(function(){ if(cthis.at

我有一个方法是一个大的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)
}
如果您想使用apply或call来代替cthis,也可以使用apply或call


然而,这似乎更糟…

使用
.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) ));
   };
};

但是我担心你不会变得更好。

你的第一个例子或多或少是做这件事的标准方法。我唯一的建议是将变量命名为cthis以外的其他名称;使其描述要绑定的对象


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

我将
setInterval
函数分解为它自己的函数,与
connect
连接到同一个对象。这样,很明显,
指的是同一对象:

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, []);
    }
}

这就是JavaScript,无论好坏。为什么
bind
对大多数人来说都不是一个有用的解决方案?当功能不存在时,进行功能检测并添加它是很简单的。@theazureshadow它很有用,但只有在您反复需要它时才有用。对于一次性使用,功能检测和支持代码是不值得的。@Box9:我知道你是从哪里来的,但我认为许多人会发现可读性增益对于正常使用是值得的(特别是如果他们在需要时在多个项目中使用它)。它是工具箱中一个有用的工具,因为它描述了闭包而不是隐式的(更不用说潜在的意外)。它是1.8.5,只有在最新的Firefox中,我用chrome 12开发,它有1.6或1.7,MDC注意到,真正的ES5绑定方法在行为上确实存在偏差——您需要在ES5和非ES5浏览器中进行测试。
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)
}
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, []);
    }
}