2017-10-19 68 views
0

好吧,這是出於「學術興趣」(儘管我想在某個地方使用它)。假設我有以下內容:刪除方法本身 - 它有效,但爲什麼,我應該使用它?

function f2() 
{ 
    delete Widget.f1; 
    Widget.f3 = function() 
    { 
     console.log("This works."); 
    } 
} 

let Widget = 
{ 
    f1: function() 
    { 
     f2(); 
    } 
} 

console.log(Widget); 
Widget.f1(); 

console.log(Widget); 
Widget.f3(); 

所以基本上我調用一個方法從對象中刪除自己,並用另一種方法替換。它似乎工作正常。所以這裏是我的兩個問題:

  1. 是否有一個很好的(技術)原因爲什麼我不應該這樣做?

  2. 從一個「在JavaScript中」的角度來看,這是如何工作的?直覺會說f1在完成之前一直保持「打開」狀態,這意味着我們刪除了一個仍然「打開」的函數。 f2()調用以某種方式「懸掛」出來了嗎?

乾杯

+1

您在執行時不會刪除函數('Widget.f1')。正在執行的函數是'f2'。因此,'f2'可以很好地刪除'Widget.f1'。 –

+0

這是刪除對象屬性'f1'而不是函數。 – MinusFour

回答

1

是否有一個良好的(技術)原因,我不應該這樣做呢?

主要的原因我不會用這個,這是混亂,容易造成錯誤當其他開發者(包括未來的BVDev)要麼不注意到你正在做的,還是不明白你爲什麼這樣做。

從「在JavaScript中」的角度來看,這是如何工作的?

Widget.f1是對函數的引用,它不是函數本身。所以當你delete Widget.f1時,那個引用現在已經消失了,但是函數在內存中仍然存在。它也繼續存在於當前的執行堆棧中。如果還有其他的函數引用,那麼在調用堆棧結束後它將繼續存在。另一方面,如果這是該函數的唯一引用,那麼在一段時間後,垃圾收集器將運行並釋放該函數佔用的內存。

+0

很酷,謝謝。我沒有考慮將函數引用的副本「在那裏」的可能性。我會尋找另一種方式。 – BVDev

相關問題