2

以下代码:

function f(a) { a.a = 5; return a; }
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});

由 Closure 编译器对此进行了优化:

function a(){return function(){}}function b(c){c.a=5}b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a()); 

(它留下了死代码。)

但是,如果我删除最后一行(仅重复调用 24 次),它会删除死代码。结果是空的。

如何强制 Closure 编译器在大型项目中也删除所有死代码?

4

1 回答 1

4

区别在于编译器是否决定内联“f”。一旦被内联,“(function(){}).a = 5”就是一个死表达式。在此之前,“f”是一个具有副作用的函数(它修改其参数)并且不能自行移除。

内联的决定是基于对内联是否会导致更小的代码大小的估计。在这种情况下,从 24 到 25 的变化是当估计内联成本超过删除函数定义所节省的成本时的临界点。

于 2013-05-21T16:33:50.640 回答