了解Closure Compiler警告

时间:2017-07-17 21:32:36

标签: javascript android google-closure-compiler duktape

我正在使用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

^^^指示符指向obj中的Object.keys(obj)。我意识到JSON.parse()这里可以返回null所以我试图对null进行明确的测试,但这没有帮助。

1 个答案:

答案 0 :(得分:1)

  

警告 - 访问名称externs中的日期无效。也许您忘了添加var关键字?

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

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

警告 - 无法访问的代码

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

  

警告 - Object.keys的实际参数1与形式参数

不匹配

null之外,JSON.parse还可以返回booleannumberstring等基元。这些不是对象,没有钥匙。它们经常通过自动装箱的概念提升为对象。

如果你能保证返回值是一个Object,你可以输入cast。

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

需要额外的括号。