了解闭包编译器警告
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
除了null
,JSON.parse
还可以return原语,如boolean
、number
、string
。这些不是对象,也没有键。它们经常通过自动装箱的概念提升为对象。
如果您可以保证 return 值是一个对象,您可以对其进行类型转换。
var obj = /** @type {Object} */ (JSON.parse(iBridge.rule()))
需要额外的括号。
我正在使用 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
除了null
,JSON.parse
还可以return原语,如boolean
、number
、string
。这些不是对象,也没有键。它们经常通过自动装箱的概念提升为对象。
如果您可以保证 return 值是一个对象,您可以对其进行类型转换。
var obj = /** @type {Object} */ (JSON.parse(iBridge.rule()))
需要额外的括号。