所以我找到了这段代码,它显然是有效的(因为它已经在生产中使用了很多年):
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
};
好奇地想知道,它是如何工作的?
undefined
,并将其自身设置为try
?undefined
和delete
?,
发布于 2011-07-25 22:37:43
它并没有将自身设置为,而是将对自身的引用设置为未定义。如果您将一个函数看作内存中的一块代码,那么在这种情况下,该代码块不会被删除,而只是对它的引用。您永远不会显式删除JavaScript中的任何内容,您只需移除对它的引用,并将其留给垃圾收集器进行清理。注意,这可能不是实际代码的情况,只是堆对象,因为这取决于引擎如何处理它(解释它,编译它,在算盘上执行它,在该逻辑上执行它,一旦函数执行,不再需要对它的原始引用,因为最初只需要将执行转移到它。
希望这是有意义的。
发布于 2011-07-25 22:37:50
记住,你永远不能在Javascript中显式地删除某些东西。您所能做的就是删除对它的所有引用,因此让垃圾收集器在下一个周期中删除它。在此函数结束时,函数本身仍在内存中,但没有对它的外部引用。下次GC运行时,它将发现这一点并释放其内存。
发布于 2011-07-25 22:37:18
windowsomeMethod只是一个参考。仅删除引用,而不删除函数本身。一旦函数完成,并且对它的所有引用都被删除,垃圾收集就应该处理它,从而避免内存泄漏。
https://stackoverflow.com/questions/6817667
复制相似问题