我有一个大的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)
}
然而,这似乎更糟......
答案 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, []);
}
}