我正在使用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
进行明确的测试,但这没有帮助。
答案 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
还可以返回boolean
,number
和string
等基元。这些不是对象,没有钥匙。它们经常通过自动装箱的概念提升为对象。
如果你能保证返回值是一个Object,你可以输入cast。
var obj = /** @type {Object} */ (JSON.parse(iBridge.rule()))
需要额外的括号。