自毁Javascript函数-它是如何工作的?

自毁Javascript函数-它是如何工作的?,javascript,closures,Javascript,Closures,因此,我发现了这段代码,它的工作方式显然与多年来的生产方式相同: window[someMethod] = function (tmp) { callback({prop:"val"}, tmp); // Garbage collect window[someMethod] = undefined; try { delete window[someMethod]; } catch (e) { } if (head)

因此,我发现了这段代码,它的工作方式显然与多年来的生产方式相同:

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
};
好奇地想知道,它是如何工作的

它如何将自身设置为未定义,并尝试 删除自己? 浏览器是否知道在调用完成之前不执行未定义和删除?怎么做? 如果浏览器立即删除它,那么之后会发生什么?最后一条线走吗? 最后,你们看到内存泄漏了吗?如果是,如何进行?
window[someMethod]只是一个引用。只删除引用,而不删除函数本身。 一旦函数完成,所有对它的引用都被删除,垃圾收集就应该处理它,避免内存泄漏

它不是将自身设置为未定义,而是将对自身的引用设置为未定义。如果将函数视为内存中的一块代码,则在本例中不会删除该代码块,只删除对它的引用。您从不显式删除JavaScript中的任何内容,只需删除对它的引用并将其留给垃圾收集器清理即可。注意,实际代码可能不是这样,只是堆对象,因为如何处理它取决于引擎如何解释、编译、在算盘上执行等等 基于该逻辑,一旦函数正在执行,就不再需要对它的原始引用,因为最初只需要将执行转移到它。 您将JS评估误解为每个语句都需要引用它。很有可能,这个方法已经及时编译,现在正在执行,就像任何其他非JS函数一样。 上面的代码中没有明显的内存泄漏。
希望这是有意义的。

记住,在Javascript中不能显式删除某些内容。您所能做的就是删除对它的所有引用,因此让垃圾收集器在下一个周期中删除它。此函数结束时,函数本身仍在内存中,但没有外部引用。下次GC运行时,它将发现这一点并释放其内存。

即使回调函数在某处保留对tmp的引用,我也不明白为什么会出现内存泄漏……这非常有用。我觉得在发布这篇文章之前,我今天好像有个屁@无处可寻——你没有料到内存泄漏是对的,但内存泄漏是错误的,除了脚本引擎无法正常或有效工作之外,没有其他原因导致这些问题发生,例如著名的IE 6循环引用内存泄漏,因为它的垃圾收集有缺陷。@RobG一般来说,垃圾收集语言中内存泄漏的使用被扩展为包括意外持有一个引用的时间比需要的时间长。