2009-11-04 48 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);