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

如何解决闭包:为什么没有内联对象?

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?