Closure Compiler,缺少高级优化的方法吗?

时间:2015-09-27 08:35:31

标签: javascript google-closure-compiler

我在angularjs应用程序中使用闭包编译器。我的JS编译时没有错误(或警告),并且可以在SIMPLE优化中正常工作。具体来说,我启用了以下警告/检查:

--jscomp_warning=checkTypes \
--jscomp_error=checkVars \
--jscomp_warning=deprecated \
--jscomp_error=duplicate \
--jscomp_warning=globalThis \
--jscomp_warning=missingProperties \
--jscomp_warning=undefinedNames \
--jscomp_error=undefinedVars \

但是,当我尝试使用ADVANCED OPTIMIZATIONS进行编译时,出现以下错误:

TypeError: a.handleEvent is not a function
    at Sj.Nh.a.(anonymous function).a.(anonymous function) (http://localhost:10080/main/pattern.dots-0-7-7-258310cc.compiled.js:118:273)
    at $h (http://app.js:120:424)
    at R (http://app.js:119:337)
    at lj (http://app.js:144:380)
    at Sj.f.re (http://app.js:151:622)
    at mo (http://app.js:302:171)
    at to (http://app.js:316:78)
    at link (http://app.js:308:335)
    ...

似乎与事件处理代码有关(来自查看源地图):

/**
 * @param {Object|Function} listener The listener function or an
 *     object that contains handleEvent method.
 * @return {!Function} Either the original function or a function that
 *     calls obj.handleEvent. If the same listener is passed to this
 *     function more than once, the same function is guaranteed to be
 *     returned.
 */
goog.events.wrapListener = function(listener) {
  goog.asserts.assert(listener, 'Listener can not be null.');

  if (goog.isFunction(listener)) {
    return listener;
  }

  goog.asserts.assert(
      listener.handleEvent, 'An object listener must have handleEvent method.');
  if (!listener[goog.events.LISTENER_WRAPPER_PROP_]) {
    listener[goog.events.LISTENER_WRAPPER_PROP_] =
        function(e) { return listener.handleEvent(e); };
  }
  return listener[goog.events.LISTENER_WRAPPER_PROP_];
};

但这看起来很奇怪。毕竟,有一个断言(显然)传递了几个线。我认为我试图保留断言(-D goog.asserts.ENABLE_ASSERTS),即使断言被优化掉了,我也不明白为什么它可以用于SIMPLE优化(断言会仍然存在)。此外,如果我使用高级优化和--debug进行编译,代码仍然可以工作,看起来它开始了命名空间崩溃的过程,但并不是一直都是这样。

有趣的是,如果我尝试添加一些console.log语句:

goog.events.wrapListener = function(listener) {
  goog.asserts.assert(listener, 'Listener can not be null.');

  if (goog.isFunction(listener)) {
    return listener;
  }

  goog.asserts.assert(
      listener.handleEvent, 'An object listener must have handleEvent method.');
  if (!listener[goog.events.LISTENER_WRAPPER_PROP_]) {
    listener[goog.events.LISTENER_WRAPPER_PROP_] =
        function(e) {
          console.log(e);
          console.log(listener);
          console.log(typeof listener);
          console.log(listener.handleEvent);
          console.log(typeof listener.handleEvent);
          return listener.handleEvent(e);
        };
  }
  return listener[goog.events.LISTENER_WRAPPER_PROP_];
};

我发现typeof listener'function'。但如果是这样的话,我们是如何首先到达这里的呢? (当然goog.isFunction(listener)应该已经返回true ......)。

我对这里发生的事情感到有点不知所措......

1 个答案:

答案 0 :(得分:0)

好吧,似乎在经过无数个小时试图调试这个问题后,答案就会在我发布问题后再次出现在我的腿上。(/ p>)

我不幸让goog.isFunction编译成符号ga - 这与全球使用情况跟踪库“Google Analytics”冲突。

我的解决方案就是将universal_analytics_api.js包括在我的外部,所有这些似乎与世界相得益彰。