Closure编译器onerror签名编译

时间:2016-06-28 21:46:30

标签: javascript google-closure-compiler

我有一个错误记录功能,如下所示:

window.onerror = function (ErrorMsg, Url, LineNumber, Col, Error) { .... }

当我通过Closure Compiler我的代码时,我收到一个警告:

JSC_TYPE_MISMATCH: assignment to property onerror of Window
found   : function (?, ?, ?, ?, ?): undefined
required: (function (string, string, number): ?|null) at line 197 character 1
    window.onerror = function (ErrorMsg, Url, LineNumber, Col, Error) {

我应该在功能定义中更改哪些内容以清除警告?

2 个答案:

答案 0 :(得分:0)

Closure Compiler只接受window.onerror的3个参数。以下是extern w3c_dom1.js的定义:

// onerror has a special signature.
// See https://developer.mozilla.org/en/DOM/window.onerror
// and http://msdn.microsoft.com/en-us/library/cc197053(VS.85).aspx
/** @type {?function (string, string, number)} */
Window.prototype.onerror;

不需要类型信息。以下是我的一些代码中的示例:

/** Sets a global error handler function in `window.onerror` to alert user.
* @return {undefined}
* @static
*/
UtilityCore.setErrorHandler = function() {
  window.onerror = function(msg, url, line) {
    var s = msg + "\n" + url + ":" + line;
    if (goog.DEBUG) {
      console.log(s);
    }
    if (UtilityCore.numErrors++ < UtilityCore.maxErrors) {
      alert(s);
      return true;
    }
  }
};

如果您需要所有5个参数:

  1. 您可以尝试将类型转换为3参数版本

  2. 您可以使用Closure Compiler项目提交有关它的问题,或在他们的电子邮件列表中询问。

  3. 上一个回答:

    这是尝试:

    /**
    * @param {string} ErrorMsg
    * @param {string} Url
    * @param {number} LineNumber
    * @param {number} Col
    * @param {Object} Error
    */
    var errorFn = function (ErrorMsg, Url, LineNumber, Col, Error) { ... }
    window.onerror = errorFn;
    

    似乎Closure Compiler只希望有3个参数,所以这可能仍然是个问题。

答案 1 :(得分:0)

编译器的onerror签名尚未更新,以符合最新的浏览器规范。你可以发送一个Pull Request来改变它。

大部分用法已改用:

window.addEventListener('error', function(evt) {}, false)

现代浏览器在传递给事件监听器的ErrorEvent object上提供相同的信息。