以下代码:
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() {});
由闭包编译器优化为:
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 次),它就会删除死代码。结果是空的。
如何强制闭包编译器删除大型项目中的所有无效代码?
区别在于编译器是否决定内联“f”。 一旦内联,“(function(){}).a = 5”就是一个死表达式。在此之前,“f”是一个具有副作用的函数(它会修改其参数)并且无法自行删除。
内联的决定基于对内联是否会导致更小的代码大小的估计。 在这种情况下,从 24 到 25 的变化是估计内联成本超过删除函数定义所节省的成本的临界点。