闭包:为什么没有内联对象?

问题描述

闭包编译器一直存在问题-有时它将内联结构的内容,有时则不会。例如:

(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)}})();

在这里使用SIMPLE_OPTIMISATIONS,但ADVANCED_OPTIMISATIONS并没有改善问题,也没有键入注释:

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

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

  exports.hello = function() {
    return Test;
  };
})()

有人知道为什么它不会内联吗?有没有一种方法可以获取报告或从编译器中查找?

谢谢!

解决方法

本地属性内联非常保守。只有在确定值是在使用之前定义的时候,它才会内联。然而,由于函数提升函数定义在对象字面量之前排序,因此函数在定义之前引用对象(即使它之前不能被调用,传递也不会跟踪它)。

更改函数定义:

function Test() {...}

const Test = function() {...}

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

(function() {
  var b = function(a) {
    a(128);
  };
  exports.hello = function() {
    return b;
  };
})();

你可以在这里看到结果:

https://closure-compiler.appspot.com/home#code%3D%252F%252F%2520%253D%253DClosureCompiler%253D%253D%250A%252F%252F%2520%2540compilation_level%2520SIMPLE_OPTIMIZATIONS%250A%252F%252F%2520%2540output_file_name%2520default.js%250A%252F%252F%2520%2540formatting%2520pretty_print%252Cprint_input_delimiter%250A%252F%252F%2520%253D%253D%252FClosureCompiler%253D%253D%250A%250A(function()%257B%250A%2520%2520const%2520C%2520%253D%2520%257BSOMETHING%253A%25200x76%252C%2520BLA%253A%2520123%257D%250A%250A%2520%2520const%2520Test%2520%253D%2520function(write)%2520%257B%250A%2520%2520%2520%2520write(5%252BC.BLA)%253B%250A%2520%2520%257D%250A%250A%2520%2520exports.hello%2520%253D%2520function()%2520%257B%250A%2520%2520%2520%2520return%2520Test%253B%250A%2520%2520%257D%253B%250A%257D)()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...