Javascript 闭包编译器,缺少具有高级优化的方法?

Javascript 闭包编译器,缺少具有高级优化的方法?,javascript,google-closure-compiler,Javascript,Google Closure Compiler,我正在angularjs应用程序中使用闭包编译器。My JS编译时不会出现错误(或警告),并且可以通过简单的优化工作。具体而言,我启用了以下警告/检查: --jscomp_warning=checkTypes \ --jscomp_error=checkVars \ --jscomp_warning=deprecated \ --jscomp_error=duplicate \ --jscomp_warning=globalThis \ --jscomp_warning=missingPrope

我正在angularjs应用程序中使用闭包编译器。My JS编译时不会出现错误(或警告),并且可以通过简单的优化工作。具体而言,我启用了以下警告/检查:

--jscomp_warning=checkTypes \
--jscomp_error=checkVars \
--jscomp_warning=deprecated \
--jscomp_error=duplicate \
--jscomp_warning=globalThis \
--jscomp_warning=missingProperties \
--jscomp_warning=undefinedNames \
--jscomp_error=undefinedVars \
但是,当我尝试使用高级优化进行编译时,会出现以下错误:

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)
    ...
这似乎与事件处理代码有关(查看源代码图):

但这似乎真的很奇怪。毕竟,有一个断言是(显然)通过的。我想我已经尝试过保留assert(
-D goog.asserts.ENABLE_asserts
),即使assert被优化掉了,我也不明白为什么它会与简单的优化一起工作(assert仍然存在)。另外,如果我使用高级优化和
--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_];
};
我看到监听器的
类型是
'function'
。但是如果是这样的话,我们是怎么来到这里的呢?(当然,
goog.isFunction(listener)
此时应该返回
true
。)


我有点不知所措,不知道这里会发生什么…

好吧,似乎在无数个小时的调试之后,在我(再次)发布问题之后,答案就落在了我的膝上

不幸的是,我将
Google.isFunction
编译为符号
ga
——这与全球使用情况跟踪库“谷歌分析”相冲突


对我来说,解决方案是只在我的外部代码中包含,一切似乎都很好。

防止这种冲突的最好方法是使用
--output\u wrapper
标志添加一个立即调用的函数包装器:
--output\u wrapper='(function(){“use strict”;%output%})。调用(this)
。这可以防止重命名的符号存在于全局范围内,并与其他脚本发生冲突。@ChadKillingsworth——谢谢,这听起来是个好主意,所以我将这样做。在我脑海中反复思考这些场景,我仍然认为我应该包括外部人员。
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_];
};