Javascript 闭包编译器:它如何决定何时内联?

Javascript 闭包编译器:它如何决定何时内联?,javascript,google-closure-compiler,Javascript,Google Closure Compiler,我试图让闭包编译器以简单模式内联一些封装在配置对象中的代码,而不需要任何类型注释。并设法降低了包裹的大小 我观察到以下情况: a、 js 编译时返回 a、 min.js (function() { (function(a) { a = a.log; a("jere"); })({ log: function(a) { console.log(a); } }); })(); 以及 b、 js 编译时 b、 min.js (function(

我试图让闭包编译器以简单模式内联一些封装在配置对象中的代码,而不需要任何类型注释。并设法降低了包裹的大小

我观察到以下情况:

a、 js

编译时返回

a、 min.js

(function() {
  (function(a) {
    a = a.log;
    a("jere");
  })({
    log: function(a) {
      console.log(a);
    }
  });
})();
以及

b、 js

编译时

b、 min.js

(function() {
  console.log("here");
})();
另一方面,

function main(){
  const config = {
    log: function log(m) {
      console.log(m);
    }
  };

  const log = config.log;

  log('m');
  log('m');
  log('m');
  log('m');
}

main()
给予

闭包编译器是如何内联的?是否有明确的方法将其用于内联包装函数

更新: ,我使用了
--假设函数包装器
,它可以更好地内联代码。但如果函数返回值,CC无法内联

(function main() {

  const config = {
    log(m) {
      console.log(m);
    }
  }

  function reconciler(c) {
    const log = c.log;
    log('jere');
    return {
      foo() {
        // More side effects
      }
    }
  }

  reconciler(config);

}())

没有一个答案。编译器使用启发式和副作用计算来决定何时内联。与嵌套作用域相比,编译器在全局作用域中内联的可能性更小

这些启发法是什么?有没有什么技巧可以让编译器闭包并内联它来编写代码?React团队成功地做到了这一点,我正在做类似的工作[这里]()编译器可以做什么和不能做什么内联的最佳参考是测试用例-有很多:
function main(){
  const config = {
    log: function log(m) {
      console.log(m);
    }
  };

  const log = config.log;

  log('m');
  log('m');
  log('m');
  log('m');
}

main()
function main() {
  console.log("m");
  console.log("m");
  console.log("m");
  console.log("m");
}
main();
(function main() {

  const config = {
    log(m) {
      console.log(m);
    }
  }

  function reconciler(c) {
    const log = c.log;
    log('jere');
    return {
      foo() {
        // More side effects
      }
    }
  }

  reconciler(config);

}())