0

我正在使用谷歌的闭包编译器来优化+混淆我通过 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?

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

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

^^^指示器指向objin Object.keys(obj)。我意识到JSON.parse()这里可能会返回null,所以我尝试进行明确的测试,null但这并没有帮助。

4

1 回答 1

1

警告 - 在 externs 中访问名称 Date 无效。也许您忘记添加 var 关键字?

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

/** @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。这些不是对象,也没有键。它们经常通过自动装箱的概念提升为对象。

如果你能保证返回值是一个对象,你可以对它进行类型转换。

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

额外的括号是必需的。

于 2017-07-18T11:59:34.817 回答