我正在尝试在setTimeout函数中使用jQuery语句,但是 我不懂它。我尝试了很多变体,比如这个(我是 使用'this'是因为setTimeout在每个函数中,并且 选择器被高速缓存/存储在一个对象中,因此$ selector:
setTimeout("" + this.$selector + ".val('" + this.savVal + "')", 1);
我该如何写这个?
谢谢!
答案 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
});
不确定问题是什么。两个对象都在相同的功能/范围内。