我正在尝试动态设置javascript中的超时。在超时内,我依赖于在超时回调函数之外更改的变量。这不是一个可靠的做法,所以我想摆脱对这个变量的依赖。
这是我的代码的摘录,适用于我的问题:
timeouts["mr"+mI] = setTimeout(function(){
groups["mr"+mI].expired = 1;
io.sockets.emit("invite_channel",'{"type":"pullback","mI":"mr'+mI+'"}');
},120000);
mI
在setTimeout
之外更改,在mI
声明中与timeouts["mr"+mI]
相同。
所以我的问题是,如何从timeouts[]
(在setTimeout回调函数中)获取对象密钥,作为mI
的替代?
提前致谢!
我认为这两个答案(在撰写本文时)都解决了我的问题。我选择了使用bind()
作为接受答案的答案。这主要是因为我(尚未)理解closed method
答案的工作原理。我试图实现它,但没有让它工作。它的另一个答案很容易实现。
我要感谢两位回答者! : - )
答案 0 :(得分:2)
我不确定我是否正确理解了这个问题,但是如果你想将mI
传递给回调并阻止它改变。您可以使用bind()
方法。
timeouts["mr"+mI] = setTimeout(function(x){
groups["mr"+x].expired = 1;
io.sockets.emit("invite_channel",'{"type":"pullback","mI":"mr'+x+'"}');
}.bind(this,mI),120000);
bind(this,mI)
会将mI
作为参数传递给函数。声明函数后,x
的值不会改变。
答案 1 :(得分:1)
您需要为从setTimeout调用的方法捕获mI
的当前值。您可以绕过该值,以便将来对mI
的修改不会更改将来将调用的方法中捕获的值。
var mI = Math.random();
var getMethod = function() {
var mrMi = mI;
return function() {
alert(mrMi);
};
};
var closedMethod = getMethod();
setTimeout(closedMethod, 0);
mI = 'abc';
setTimeout(closedMethod, 0);