自毁Javascript功能 - 它是如何工作的?

Mrc*_*ief 18 javascript closures

所以我找到了这段代码,它显然有效(因为它已经生产了多年):

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
};
Run Code Online (Sandbox Code Playgroud)

很想知道,它是如何工作的?

  1. 它怎么能自己设置为undefined它的身体内,并trydelete自身?
  2. 是否浏览器知道不执行undefined,并delete直至通话结束?如何?
  3. 如果浏览器立即删除它,那么之后会发生什么?最后一行是否运行?
  4. 最后,你们看到这个泄漏的记忆吗?如果有,怎么样?

yan*_*yan 21

  1. 它没有将自己设置为undefined,它将自己的引用设置为undefined.如果您将函数视为内存中的代码块,则在这种情况下不会删除该代码块,只是对它的引用.您从未在JavaScript中明确删除任何内容,只需删除对它的引用并将其留给垃圾收集器进行清理.注意,这可能不是实际代码,只是堆对象的情况,因为它取决于引擎如何对待它(解释它,编译它,在算盘上执行它,等等)
  2. 基于该逻辑,一旦函数执行,就不再需要对它的原始引用,因为最初只需要将执行转移到它.
  3. 你错误地将JS评估误认为需要为每个语句引用它.很有可能,这个方法已经被Just-In-Time编译,现在正在执行,就像任何其他非JS函数一样.
  4. 上面的代码中没有明显的内存泄漏.

希望这是有道理的.

  • @RobG通常在垃圾收集语言中使用"内存泄漏"扩展到包括意外地持有超过必要的引用. (3认同)