Javascript 结束语:为什么';对象不能内联吗?

Javascript 结束语:为什么';对象不能内联吗?,javascript,google-closure-compiler,Javascript,Google Closure Compiler,我一直对闭包编译器有一个问题——有时它会内联结构的内容,有时则不会。例如: (function(){ const C = {SOMETHING: 0x76, BLA: 123} function Test(write) { write(5+C.BLA); } exports.hello = function() { return Test; }; })() 不内联: (function(){function a(b){b(5+c.BLA)}var c={

我一直对闭包编译器有一个问题——有时它会内联结构的内容,有时则不会。例如:

(function(){
  const C = {SOMETHING: 0x76, BLA: 123}

  function Test(write) {
    write(5+C.BLA);
  }

  exports.hello = function() {
    return Test;
  };
})()
不内联:

(function(){function a(b){b(5+c.BLA)}var c={SOMETHING:118,BLA:123};exports.hello=function(){return a}})();
但只需更改导出
Test
的方式即可:

(function(){
  const C = {SOMETHING: 0x76, BLA: 123}

  function Test(write) {
    write(5+C.BLA);
  }

  exports.hello = Test;
})()
将导致其处于罚款状态:

(function(){exports.hello=function(a){a(128)}})();
我在这里使用的是简单的优化,但是高级的优化并不能改善问题,类型注释也不能:

(function(){
  /** @enum {number} */
  const C = {/** @const */SOMETHING: 0x76, /** @const */BLA: 123}

  function Test(write) {
    write(5+C.BLA);
  }

  exports.hello = function() {
    return Test;
  };
})()
知道为什么它不会内联吗?有没有办法从编译器那里得到报告或发现


谢谢

本地属性内联非常保守。如果在使用该值之前确定该值是已定义的,那么它将仅内联。但是,由于函数的提升,函数定义在对象文本之前排序,因此函数在定义对象之前引用对象(即使之前不能调用它,过程也不会跟踪它)

将函数定义更改为:

函数测试(){…}

const Test=function(){…}

允许编译器内联它。这将您的代码示例减少到:

(function() {
  var b = function(a) {
    a(128);
  };
  exports.hello = function() {
    return b;
  };
})();
您可以在此处看到结果:


本地属性内联非常保守。如果在使用该值之前确定该值是已定义的,那么它将仅内联。但是,由于函数的提升,函数定义在对象文本之前排序,因此函数在定义对象之前引用对象(即使之前不能调用它,过程也不会跟踪它)

将函数定义更改为:

函数测试(){…}

const Test=function(){…}

允许编译器内联它。这将您的代码示例减少到:

(function() {
  var b = function(a) {
    a(128);
  };
  exports.hello = function() {
    return b;
  };
})();
您可以在此处看到结果: