删除自身的方法 - 它有效,但为什么,我应该使用它?

时间:2017-10-19 12:01:13

标签: javascript javascript-objects

好的,这是出于“学术兴趣”(虽然我想在某处使用它)。假设我有以下内容:

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()调用是以某种方式“悬挂”出来的吗?

  3. 干杯

1 个答案:

答案 0 :(得分:1)

  

为什么我不应该这样做有一个好的(技术性)原因?

我不会使用它的主要原因是,当其他开发人员(包括future-BVDev)没有注意到你正在做这件事,或者不明白你为什么这么做时,它会引起混淆并且可能导致错误这样做。

  

从一个“在JavaScript的内容”的角度来看,这是如何工作的?

Widget.f1是对函数的引用,它不是函数本身。因此,当您delete Widget.f1时,该引用现在已经消失,但该函数继续存在于内存中。它也继续存在于当前执行堆栈中。如果还有对该函数的其他引用,则在调用堆栈完成后它将继续存在。另一方面,如果这是该函数的唯一引用,那么一段时间之后,垃圾收集器将运行并释放该函数占用的内存。