3

我有一个创建测试元素的功能。在返回函数之前,我将取消对测试元素的引用,以帮助防止内存泄漏。但是闭包编译器正在删除它认为不需要的那一行 b/c(在两种模式下)。是否可以添加某种评论以防止删除该行?

function isExample (testElem) {
 var bool; 
 testElem = testElem || document.createElement('div');

 // Do stuff in here to determine `bool`
 // ...

 // Then nullify the reference
 testElem = null; // The compiler removes this line. How do I make it keep it?

 return bool;
}
4

2 回答 2

5

它不是必需的。垃圾收集器也会这样做,因此 Google Closure Compiler 只是将其删除。

我不知道有任何垃圾收集器会泄漏内存,如果有的话,JS 会有很大的问题。

请记住,JS 具有函数作用域,这意味着一旦执行离开函数,函数中定义的任何变量都将被垃圾回收。

这是垃圾收集器的基本功能之一,如果 js 引擎在此上泄漏内存,这将是非常糟糕的。

对于旧的 IE 泄漏,您可以尝试通过在使编译器testElement = []无效后添加来解决编译器问题。

于 2012-06-14T07:56:47.837 回答
2

在这种情况下,编译器是正确的。但是,如果您对保留代码一无所知,那么您将需要使用带引号的语法来导出值或使用接收器对象。

function sinkValue(x) {
  sinkValue[' '](x);
  return x;
}
sinkValue[' '] = function(){};

function isExample (testElem) {
  var bool;
  var obj = { 'elem': testElem || document.createElement('div') };

  // Do stuff in here to determine `bool`
  // ...

  obj['elem'] = null;
  sinkValue(obj);

  return bool;
}

引用语法可防止重命名和死代码消除,因此您将否定对该对象属性的任何优化。在这种情况下,尽管您将对象的寿命延长到函数之外(这似乎与您的意图相反)。

没有注释可以准确指定您想要的内容。您可以在以下位置查看与此相关的讨论:

编译器完全按照预期执行,因为它正在删除无用的代码。

于 2012-06-14T13:14:02.647 回答