setTimeout函数中的变量(jQuery)

nor*_*rth 8 javascript variables jquery timeout

我正在尝试在setTimeout函数中使用jQuery语句,但我没有让它工作.我尝试了很多变体,比如这个(我使用'this'因为setTimeout在每个函数中,并且选择器被缓存/存储在一个对象中,因此$ selector):

setTimeout("" + this.$selector + ".val('" + this.savVal + "')", 1);
Run Code Online (Sandbox Code Playgroud)

我该怎么写呢?

谢谢!

Ant*_*nes 19

当您需要this在调用setTimeout时保留当前项时使用此结构: -

setTimeout((function(self) {
  return function() { $selector.val(self.savVal) };
})(this), 1);
Run Code Online (Sandbox Code Playgroud)

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


EMP*_*EMP 7

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

var storedThis = this;
setTimeout(function() { $selector.val(storedThis.savVal); }, 1);
Run Code Online (Sandbox Code Playgroud)


Mar*_*rco 1

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

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

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