Javascript 如何防止Google Closure编译器删除一行

Javascript 如何防止Google Closure编译器删除一行,javascript,google-closure-compiler,google-closure,Javascript,Google Closure Compiler,Google Closure,我有一个创建测试元素的函数。在返回函数之前,我将取消对测试元素的引用,以帮助防止内存泄漏。但是正在删除它认为不需要的b/c行(在两种模式下)。是否有一些我可以添加的方法来防止线路被删除 function isExample (testElem) { var bool; testElem = testElem || document.createElement('div'); // Do stuff in here to determine `bool` // ... // The

我有一个创建测试元素的函数。在返回函数之前,我将取消对测试元素的引用,以帮助防止内存泄漏。但是正在删除它认为不需要的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;
}

这是不必要的。垃圾收集器也会这样做,所以Google闭包编译器只是将其删除

我不知道有哪一个垃圾收集器会在这方面泄漏内存,如果有,JS会有相当大的问题

请记住,JS具有函数作用域,这意味着函数中定义的任何变量都将在执行退出函数后被垃圾收集

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


对于旧的IE漏洞,您可以尝试在取消其值后添加
testElement=[]
来解决编译器的问题。

在这种情况下,编译器是正确的。但是,如果您死心塌地地想要保留代码,那么您需要使用引号语法来导出值或使用sink对象

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;
}
引用的语法阻止重命名和死代码消除,因此您将否定对该对象属性的任何优化。在这种情况下,尽管您正在将对象的寿命延长到功能之外(这似乎与您的意图相反)

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


编译器正在做的正是它所要做的,因为它正在删除无用的代码。

旧IE中存在内存泄漏问题。jQuery和Modernizer在某些函数中都会使元素为null,这是有原因的。请注意,它不适用于创建闭包的函数,因为现在变量必须保持活动状态,因为闭包即使在原始函数返回后也可以访问它。不过OP中不是这样的,所以+1:)@ryanve它在旧IE中为移除的DOM元素上的事件侦听器泄漏内存,而不是像这样的情况:-)@Esailija是的,那里没有闭包,这就是为什么我指定了函数中定义的任何变量:p示例中没有显示测试,因此您无法知道“case”。无论如何,我不想找出是否需要该行。我正在试图找出如何向编译器添加注释而不是删除它。Chad,该对象是未被扫描的,因此如果这确实有效,它将来可能仍然会被删除。使用全局窗口而不是obj会起作用,但肯定是杀伤力太大了。是的,我很担心。两者似乎都太过分了。对于这种情况,似乎需要在goog.reflect.sinkValue定义中进行复制。我会适当地修改答案。