Javascript 如何防止Google Closure编译器删除一行
我有一个创建测试元素的函数。在返回函数之前,我将取消对测试元素的引用,以帮助防止内存泄漏。但是正在删除它认为不需要的b/c行(在两种模式下)。是否有一些我可以添加的方法来防止线路被删除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
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定义中进行复制。我会适当地修改答案。