2009-11-04 62 views
8

我想在setTimeout函数中使用jQuery语句,但是 我不明白它的作用。我尝试了很多变体,像这样的(我 使用“这个”,因为setTimeout的是各个功能的内部, 选择器被高速缓存/存储在对象,因此,$选择器):setTimeout函数中的变量(jQuery)

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

我该如何写这个?

谢谢!

+3

'setTimeout()'和'setInterval()'中的字符串已过时。应该使用函数来代替。 – 2009-11-04 13:04:09

回答

1

如果您尝试使用的变量是在循环的每个步骤中定义的,那么您可以这样做。

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

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

Marco,“myConfigObj。$ myCachedSelector”似乎是问题所在。它返回“未定义”。我用一个简单的字符串取代它,它会被正确地返回... – north 2009-11-04 13:50:31

19

当你需要调用的setTimeout使用这种结构时保留当前this项: -

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

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

+0

优雅,如果有点神秘的人不熟悉封闭。感觉愚蠢的是,当我意识到IE没有传递参数时,这并不是第一个想到的事情。我恳求“.NET Developer”作为我的借口。那是一件事,对吧? – 2013-03-29 23:38:09

0

感谢您的回答。

我现在在setTimeout里面使用了一个函数。但是我发现真正的问题在于:在每个函数中,我尝试访问指向配置对象内的属性的对象属性,但结果(例如对于这个。选择器)是“未定义的” 。

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

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

不知道是什么问题。两个对象都在同一个函数/作用域中。

7

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

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