setTimeout函数中的变量(jQuery)

时间:2009-11-04 12:59:32

标签: javascript jquery variables timeout

我正在尝试在setTimeout函数中使用jQuery语句,但是 我不懂它。我尝试了很多变体,比如这个(我是 使用'this'是因为setTimeout在每个函数中,并且 选择器被高速缓存/存储在一个对象中,因此$ selector:

setTimeout("" + this.$selector + ".val('" + this.savVal + "')", 1);

我该如何写这个?

谢谢!

4 个答案:

答案 0 :(得分:19)

当您需要在调用setTimeout时保留当前this项时,请使用以下结构: -

setTimeout((function(self) {
  return function() { $selector.val(self.savVal) };
})(this), 1);

这将从外部函数执行上下文创建一个闭包。 outer函数返回一个内部函数,该函数将访问self参数。它是在超时发生时调用的内部函数,但self的值将保持原始this值。

答案 1 :(得分:7)

AnthonyWJones 提供了一个很好的答案,但还有另一个类似的答案,它更易于编写和阅读。您只需将“this”的值存储在局部变量中,即

var storedThis = this;
setTimeout(function() { $selector.val(storedThis.savVal); }, 1);

答案 2 :(得分:1)

如果您尝试使用的变量是在循环的每个步骤中定义的,那么您可能会执行此类操作。

var myObj = {
  $selector: myConfigObj.$myCachedSelector
}

$.each([ myObj, mySecondObj, myThirdObj ], function(n, $selector) {
    setTimeout(function() {
        $selector.val(saveVal);
    }, 1);
});

答案 3 :(得分:0)

感谢您的回答。

我现在正在使用setTimeout中的一个函数。但我发现真正的问题在于:在每个函数中我试图访问指向配置对象中属性的对象属性,但结果(例如对于此。$ selector)是“未定义”

var myObj = {
  $selector: myConfigObj.$myCachedSelector
}

$.each([ myObj, mySecondObj, myThirdObj ], function() {
    //code
});                 

不确定问题是什么。两个对象都在相同的功能/范围内。