1

I have a function that checks that the callback methods within an object exist. Currently the Closure Compiler renames the methods (onClickDisplay and onCloseHide) so all the checks in makeCallbacks() fail.

Is there a way to tell the Closure Compiler to not rename the methods (onClickDisplay and onCloseHide) or tell the Compiler to also rename the method names in callbackNames()

makeCallbacks = function(tobject, methodNames) {
 var callbacks = {};

 methodNames.each(function(methodName) {
    if (!tobject[methodName]) {
     throw new Error(methodName + ' missing from ' + tobject.toString());
    }
    callbacks[methodName] = tobject[methodName].bind(tobject);
 });

 return callbacks;
};


FeedbackController = Class.create({
  initialize: function(id, item) {
   this.callbacks = makeCallbacks(this, this.callbackNames());
  },

  observeElements: function() {
   $$(this.id + ' .closeme').invoke('observe', 'click', this.callbacks.onCloseHide);
  },

  callbackNames: function() {
   return ['onClickDisplay', 'onCloseHide'];
  },

  onClickDisplay: function(e) {
   // do something
  },

  onCloseHide: function(e) {
   // do something
  }
});
4

2 回答 2

2

您可以通过以下方式明确告诉闭包编译器不要重命名变量:

goog.exportProperty(FeedbackController, 'onClickDisplay', FeedbackController.onClickDisplay);

或者通过在您的方法中包含自定义 externs 文件:

function onClickDisplay() {};
function onCloseHide() {};

并将其提供给闭包编译器:

"--externs=/externs/externs.js"

这将阻止它重命名变量。通常,您只会将其用于与外部库进行交互。

来源:关闭权威指南

于 2013-03-27T16:23:36.640 回答
1

您使用的编码风格违反了具有 ADVANCED_OPTIMIZATIONS 的 Closure-compiler 的核心要求之一:一致的属性访问。即,您不能使用点分符号obj.prop和带引号的组合来引用相同的属性obj['prop']。您可以引用传递给您的Class.create调用的属性名称,但这将使死代码删除和类型检查无效。如果您不想要其中任何一种行为,那么您真的应该使用 SIMPLE_OPTIMIZATIONS。

您的代码还隐藏了您已定义属性的事实,FeedbackController因为 Closure-compiler 无法识别Class.create正在分配属性。

除非你愿意改变你的编码风格,否则我会推荐使用 SIMPLE_OPTIMIZATIONS。

请参阅我的哪个编译级别适合我?发布有关优化级别之间决定因素的更多信息。

于 2013-03-28T14:17:56.140 回答