【问题标题】:Understanding Closure Compiler warnings了解闭包编译器警告
【发布时间】:2017-07-17 21:32:36
【问题描述】:

我正在使用 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 循环中,^^^ 错误指示器指向 i++,会引发 WARNING - unreachable code

  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() 可以返回null,所以我尝试对null 进行显式测试,但这没有帮助。

【问题讨论】:

    标签: javascript android google-closure-compiler duktape


    【解决方案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 与形参不匹配

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

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

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

    额外的括号是必需的。

    【讨论】:

    • 谢谢 - 我曾尝试过类型转换,但我缺少括号。实际上,最后我最终使用了出色的JavascriptObfuscator,因为 Closure 的输出并没有真正晦涩难懂——很公平,它从未声称自己是混淆器。来自混淆器的臃肿代码大小似乎对我的应用没有影响。但是,我发现了使用 Closure 作为检查 JS 代码的一种方法的好处——正如您发现的那样,我确实有一个错误,导致代码无法访问。谢谢谷歌!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2020-01-04
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多