Javascript在间隔/超时内创建此对象
我有一个方法是一个大的setInterval语句,它需要从区间内访问拥有该方法的对象的this对象。我实现了一个简单的闭包,但它似乎不是很优雅: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
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, []);
}
}