2017-10-19 67 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

相关问题