如何重命名/保留回调方法

时间:2013-03-27 14:46:26

标签: javascript google-closure-compiler google-closure

我有一个函数可以检查对象中的回调方法是否存在。目前Closure Compiler重命名方法(onClickDisplay和onCloseHide),因此makeCallbacks()中的所有检查都会失败。

有没有办法告诉Closure Compiler不重命名方法(onClickDisplay和onCloseHide)或告诉编译器也重命名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
  }
});

2 个答案:

答案 0 :(得分:2)

您可以通过执行以下操作明确告诉闭包编译器不要重命名变量:

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

或者使用您的方法包含自定义外部文件:

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

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

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

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

来源:Closure the Definitive Guide

答案 1 :(得分:1)

您正在使用的编码样式违反了使用ADVANCED_OPTIMIZATIONS的Closure编译器的一个主要要求:一致的属性访问。也就是说,您不能使用点分表示法obj.prop和引用obj['prop']的混合来引用同一属性。您可以引用传递给Class.create调用的属性名称,但这将导致死代码删除和类型检查无效。如果您不想要这些行为,那么您应该真正使用SIMPLE_OPTIMIZATIONS。

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

除非您愿意更改编码风格,否则我建议您使用SIMPLE_OPTIMIZATIONS。

有关优化级别之间决定因素的更多信息,请参阅我的Which Compilation Level is Right for Me?帖子。