Grunt Uglify 生成浏览器不同意的代码

Grunt Uglify produces code that browsers do not agree with

我是 G运行t 和 g运行t-contrib-uglify 的新手。我创建了一个测试 JavaScript 文件:

function global(window) {
  window.test = alert("Test");
  test();
})(window);

丑化后显示为

!function(a){a.test=alert("Test"),test()}(window);

jsfiddle

我对两件事感到困惑:

当我在 Chrome 中 运行 时,会适时出现警报,但控制台会抱怨 Uncaught TypeError: test is not a function。当我通过 JSHint 运行 它时,它报告:"Expected an assignment or function call and instead saw an expression."

g运行t-contrib-uglify 是否利用了 JavaScript 中 Chrome 和我都不完全理解的方面?

它会导致 Chrome 出错,因为您的原始代码无效。您实际做的是将 alert("Test") 的结果分配给 window.testalert returns undefined,因此当您稍后尝试调用 test 时,它引用 undefined 而不是函数。您还遗漏了一个左括号,但这并没有导致此处出现问题。

看起来您想要做的是创建一个代理 alert 函数,该函数将使用预定义的输入参数调用它。您可以使用 bind() 函数来执行此操作,如下所示:

(function (window) {
    window.test = alert.bind(undefined, 'Test');
    test();
})(window);

以上应该会产生您预期的结果。

至于为什么它使用逗号而不是分号,可能是因为缩小代码验证了一个表达式(参见expressions vs statements),并且表达式中不允许使用分号,而逗号是允许的。