簡體   English   中英

自毀Javascript功能 - 它是如何工作的?

[英]Self destructing Javascript function - How does it work?

所以我找到了這段代碼,它顯然有效(因為它已經生產了多年):

window[someMethod] = function (tmp) {
    callback({prop:"val"}, tmp); 

    // Garbage collect
    window[someMethod] = undefined;
    try { 
        delete window[someMethod]; 
    } 
    catch (e) { }
    if (head) { 
        head.removeChild(script); 
    }   
    // head refers to DOM head elem and script refers to some script file elem
};

很想知道,它是如何工作的?

  1. 它如何將自己設置為在其體內undefinedtry delete自身?
  2. 在呼叫結束之前,瀏覽器是否知道不執行undefineddelete 如何?
  3. 如果瀏覽器立即刪除它,那么之后會發生什么? 最后一行是否運行?
  4. 最后,你們看到這個泄漏的記憶嗎? 如果有,怎么樣?
  1. 它沒有將自己設置為undefined,它將自己的引用設置為undefined。 如果您將函數視為內存中的代碼塊,則在這種情況下不會刪除該代碼塊,只是對它的引用。 您從未在JavaScript中明確刪除任何內容,只需刪除對它的引用並將其留給垃圾收集器進行清理。 注意,這可能不是實際代碼,只是堆對象的情況,因為它取決於引擎如何對待它(解釋它,編譯它,在算盤上執行它,等等)
  2. 基於該邏輯,一旦函數執行,就不再需要對它的原始引用,因為最初只需要將執行轉移到它。
  3. 你錯誤地將JS評估誤認為需要為每個語句引用它。 很有可能,這個方法已經被Just-In-Time編譯,現在正在執行,就像任何其他非JS函數一樣。
  4. 上面的代碼中沒有明顯的內存泄漏。

希望這是有道理的。

請記住,您無法在Javascript中明確刪除某些內容。 您所能做的就是刪除對它的所有引用,然后讓垃圾收集器在下一個周期中將其刪除。 在此函數結束時,函數本身仍在內存中,但沒有外部引用。 下次GC運行時,它會發現它並釋放其內存。

window [someMethod]只是一個引用。 僅刪除引用,而不刪除函數本身。 一旦函數完成,並且刪除了對它的所有引用,垃圾收集應該處理它,避免內存泄漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM