【问题标题】:Get object key within function as a value获取函数内的对象键作为值
【发布时间】:2015-04-19 12:42:36
【问题描述】:

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

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

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

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

所以我的问题是,如何从timeouts[](setTimeout 回调函数内部)获取对象键,以替代mI

提前致谢!


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

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

【问题讨论】:

    标签: javascript object callback key


    【解决方案1】:

    我不确定我是否正确理解了这个问题,但是如果您想将 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 的值就不会改变。

    【讨论】:

    • 其实我才想通的。
    【解决方案2】:

    您需要为从 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);

    【讨论】:

    • 你能解释一下吗?是返回函数的诀窍吗?这样做,您调用/执行的所有操作都不会受到未来修改的影响(在这种情况下,mrMi)?
    • getMethod 是一个函数,它在被调用时将mI 的当前值捕获为mrMi,并在调用返回的方法时返回该值(例如getMethod()())。这样,在外部上下文中对mI 的修改不会影响将来调用的方法的行为(通过setTimeout)。这有助于您对使用 setTimeout 计划的方法的行为更有信心,因为变量在您计划调用和实际调用之间不会发生变化。
    猜你喜欢
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    相关资源
    最近更新 更多