2011-03-29 78 views
1

基本上我想加載JS文件中像這樣到頁面動態動態加載和刪除JS代碼從DOM和內存

globalVar = "some variable"; 
alert(globalVar); 

然後我想刪除它,我可以很容易地從DOM刪除腳本,但我將有globalVar留在記憶裏......

是否有一個JS庫,將幫助我加載腳本,然後卸載它和卸載所有的變量,類,通過該腳本被宣稱的功能呢?還是有一些技巧可以做到這一點?

回答

0

這是可怕的JavaScript。如果你要導入的JS對全局對象沒有任何幫助,那麼當你刪除它時(例如改變DOM),它就不應該爲全局對象編寫新變量。

希望你有超過進口JS控制,並應封裝代碼的自動執行功能,並保證所有的變量聲明開始var。這意味着你不會用自己的變量來污染全局對象,並且可以在腳本中執行任何你需要的操作。上面的代碼將成爲:

function() { 
    var globalVar = "some variable"; 
    alert(globalVar); 
}(); 

這將確保沒有新的變量被寫入到全局對象,你仍然有機會獲得他們改變他們(這大概你需要做的)。

如果您想了解更多信息,您是否可以更多地瞭解重要劇本的實際效果?

+0

我認爲你在某種程度上是正確的..我會標記你的'解決方案'作爲現在的答案... – 2011-04-05 12:23:42

+0

它可能是你寫的時候,但是在現代SPA中,異步模塊的加載和卸載是需要的。說你有多個網頁,你需要在特定元素上實例化一個jQuery插件。當您導航到新頁面時,上一頁的代碼和事件偵聽器仍然存在。 – r3wt 2015-01-07 08:56:43

+0

感謝necro的帖子。你爲什麼要在SPA中卸載一個模塊,但又想保持模塊的效果? – EMMERICH 2015-01-13 08:00:45

3

在JavaScript中,當您聲明一個全局變量時,它實際上是「全局」對象(通常是DOMWindow或「窗口」)的一個屬性,因此您可以簡單地通過變量的名稱刪除全局引用。例如:

var foo = 123; 
alert(foo); // Alerts "123" 
alert(window.foo); // Alerts "123" 
delete window.foo; 
foo; // ReferenceError: foo is not defined. 

所以,如果你可以跟蹤全局變量的使用(這應該是非常非常少,像一個),你可以刪除它從「窗口」屬性或「全球「根級對象。

更新

您可以擴展這個想法通常的工作方式如下。在腳本開始處,枚舉全局對象的屬性並將它們存儲在引用對象中。然後,當您想要標識新添加的全局變量時,請再次枚舉全局屬性,並僅存儲引用對象中不存在的屬性(這意味着它們是自上次檢查後新添加的)。然後簡單地刪除這些附加屬性。

+0

好吧..正如我所說的..我動態加載JS,我只是不知道什麼variebles,分類,功能它將宣佈... – 2011-03-29 09:39:58

+0

@Ai_boy:請參閱我的答案中新添加的段落。 – maerics 2011-03-29 09:45:03

+0

是否有一個「準備好」的代碼或框架來做到這一點? 「我很懶,因爲哈斯克爾」:) :) – 2011-03-29 09:54:52