首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >自毁Javascript函数-它是如何工作的?

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

Stack Overflow用户
提问于 2011-07-25 22:28:24
回答 3查看 3.7K关注 0票数 18

所以我找到了这段代码,它显然是有效的(因为它已经在生产中使用了很多年):

代码语言:javascript
复制
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
};

好奇地想知道,它是如何工作的?

  1. 如何在其主体内将其自身设置为undefined,并将其自身设置为try
  2. 浏览器是否知道在调用完成之前不执行undefineddelete
  3. 如果浏览器立即将其删除,那么之后会发生什么?最后一行运行了吗?,

  1. ,你们看到这个内存泄漏了吗?如果是,是怎么做的?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-25 22:37:43

它并没有将自身设置为,而是将对自身的引用设置为未定义。如果您将一个函数看作内存中的一块代码,那么在这种情况下,该代码块不会被删除,而只是对它的引用。您永远不会显式删除JavaScript中的任何内容,您只需移除对它的引用,并将其留给垃圾收集器进行清理。注意,这可能不是实际代码的情况,只是堆对象,因为这取决于引擎如何处理它(解释它,编译它,在算盘上执行它,在该逻辑上执行它,一旦函数执行,不再需要对它的原始引用,因为最初只需要将执行转移到它。

  1. 你误解了JS求值要求每条语句都引用它。很可能,此方法已进行了实时编译,现在可以像执行任何其他非JS函数一样执行。
  2. 上面的代码中没有明显的内存泄漏。

希望这是有意义的。

票数 21
EN

Stack Overflow用户

发布于 2011-07-25 22:37:50

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

票数 3
EN

Stack Overflow用户

发布于 2011-07-25 22:37:18

windowsomeMethod只是一个参考。仅删除引用,而不删除函数本身。一旦函数完成,并且对它的所有引用都被删除,垃圾收集就应该处理它,从而避免内存泄漏。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6817667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档