获取函数中的对象键作为值

时间:2015-04-19 12:42:36

标签: javascript object callback key

我正在尝试动态设置javascript中的超时。在超时内,我依赖于在超时回调函数之外更改的变量。这不是一个可靠的做法,所以我想摆脱对这个变量的依赖。

这是我的代码的摘录,适用于我的问题:

timeouts["mr"+mI] = setTimeout(function(){
    groups["mr"+mI].expired = 1;
    io.sockets.emit("invite_channel",'{"type":"pullback","mI":"mr'+mI+'"}');
},120000);

mIsetTimeout之外更改,在mI声明中与timeouts["mr"+mI]相同。

所以我的问题是,如何从timeouts[](在setTimeout回调函数中)获取对象密钥,作为mI的替代?

提前致谢!


我认为这两个答案(在撰写本文时)都解决了我的问题。我选择了使用bind()作为接受答案的答案。这主要是因为我(尚未)理解closed method答案的工作原理。我试图实现它,但没有让它工作。它的另一个答案很容易实现。

我要感谢两位回答者! : - )

2 个答案:

答案 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);