了解闭包编译器警告

Understanding Closure Compiler warnings

我正在使用 Google 的闭包编译器来优化+混淆我通过 Duktape 在 Android 应用程序中 运行 的代码。我已经成功地处理了 Closure 返回给我的大部分警告消息。然而,有一些让我难过。我应该怎么做才能对付他们?

var Uny = 
  {"version":1, "d":new Date(), "uOff":new Date().getTimezoneOffset()*60}

accessing name Date in externs has no effect. Perhaps you forgot to add a var keyword?

这是我在提供给 Closure CLI 的 externs.js 文件中声明的一个对象。

function moreSlotsToCome(slots,ndx)
{
 var i,range;
 for(i= ndx + 1;i < slots.length;i++)
 {
  range = makeRange(slots[i]);
  if (range[0] == range[1]) break;
  return 1;
 } 
 return 0;
}

在上面的 for 循环中抛出 WARNING - unreachable code^^^ 错误指示器指向 i++

  var obj = JSON.parse(iBridge.rule()),
  keys = Object.keys(obj);

WARNING - actual parameter 1 of Object.keys does not match formal parameter
found   : *
required: Object

^^^ 指标指向 Object.keys(obj) 中的 obj。我意识到 JSON.parse() 这里可以 return null 所以我试图对 null 进行显式测试,但这没有帮助。

WARNING - accessing name Date in externs has no effect. Perhaps you forgot to add a var keyword?

Externs 应该只是类型声明。通常,它们不应包含可执行代码(表达式的右侧)。像这样写你的外部人员:

/** @const */
var Uny = {};
/** @type {number} */ Uny.version;
/** @type {!Date} */ Uny.d;
/** @type {number} */ Uny.uOff;

WARNING - unreachable code

你的循环体只会执行一次。你有一个无条件退出 return 1 所以编译器是正确的, i++ 永远不会执行。这可能不应该是一个循环。

WARNING - actual parameter 1 of Object.keys does not match formal parameter

除了nullJSON.parse还可以return原语,如booleannumberstring。这些不是对象,也没有键。它们经常通过自动装箱的概念提升为对象。

如果您可以保证 return 值是一个对象,您可以对其进行类型转换。

var obj = /** @type {Object} */ (JSON.parse(iBridge.rule()))

需要额外的括号。