好的,这是出于“学术兴趣”(虽然我想在某处使用它)。假设我有以下内容:
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();
所以基本上我调用一个方法从对象中删除自己并用另一个方法替换。它似乎工作正常。所以这是我的两个问题:
我不应该这么做(技术性)吗?
从“在JavaScript的内容”的角度来看,这是如何工作的?直觉会说f1在完成之前保持“开放”状态,这意味着我们删除了一个仍然“开放”的功能。 f2()调用是以某种方式“悬挂”出来的吗?
干杯
答案 0 :(得分:1)
为什么我不应该这样做有一个好的(技术性)原因?
我不会使用它的主要原因是,当其他开发人员(包括future-BVDev)没有注意到你正在做这件事,或者不明白你为什么这么做时,它会引起混淆并且可能导致错误这样做。
从一个“在JavaScript的内容”的角度来看,这是如何工作的?
Widget.f1
是对函数的引用,它不是函数本身。因此,当您delete Widget.f1
时,该引用现在已经消失,但该函数继续存在于内存中。它也继续存在于当前执行堆栈中。如果还有对该函数的其他引用,则在调用堆栈完成后它将继续存在。另一方面,如果这是该函数的唯一引用,那么一段时间之后,垃圾收集器将运行并释放该函数占用的内存。