2012-07-04 42 views
1

Determing if a SQL select returns an empty set asynchronously?我最終試圖使用對象的方法作爲事件處理程序。在事件處理程序的上下文中,使用正常的「this」對象並不對應於方法的對象(爲什麼不能確定,除了我目前對javascript的簡單理解之外,我的猜測是由於變量名稱的作用域?)。這是否在JavaScript中創建循環引用?

正如我在前面的問題中提到的,從http://w3future.com/html/stories/callbacks.xml開始,他們的解決方案是基本上讓每個對象都提供一個「var me = this」變量。我的問題是,這是否會創建一個循環引用來防止對象被垃圾收集?

如果是這樣,是否有更好的方法來完成任務?

謝謝。

回答

2

是的,這將創建一個循環引用。

但是,它不會造成任何問題。
現代的Javascript垃圾收集器可以很好地處理循環引用。 (在IE6中,DOM和用戶對象之間的參考交叉點除外)

+0

DOM <-> JavaScript問題只發生在IE6中(而不是IE,FIrefox,Chrome ,...)? – Prusse

+0

@Prusse:我相信如此。 – SLaks

0

如果s和引用它的所有內容都離開可達作用域或被手動刪除,那麼它將被垃圾收集。如果您刪除s,但statement.executeAsync仍然提及回調,則對me的引用也會保留。

delete s; 
s; //undefined 

//This will still contain the function reference 
statement.executeAsync.handleResult; 

delete statement; //Now s and me should be garbage collected 

如果你只是單獨清除每個處理程序而不是語句對象,那也可以。假設您可以分別到達每個回調。

delete statement.executeAsync.handleResult; 
delete statement.executeAsync.handleError; 
delete statement.executeAsync.handleCompletion; 

這也取決於如何實現executeAsync。如果內部實現不將回調存儲在超過最終回調的範圍內,那麼它將被清除並刪除s