0

我是 Grunt 和 grunt-contrib-uglify 的新手。我创建了一个测试 JavaScript 文件:

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

当它被丑化时,它显示为

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

jsfiddle

我对两件事感到困惑:

  • ("Test")为什么和之间有逗号而不是分号test
  • 这段代码实际上是如何产生预期结果的?

当我在 Chrome 中运行它时,会适当地出现一个警报,但控制台会抱怨Uncaught TypeError: test is not a function。当我通过 JSHint 运行它时,它报告:“期望一个赋值或函数调用,而是看到一个表达式。”

grunt-contrib-uglify 是否利用了 Chrome 和我都不完全理解的 JavaScript 方面?

4

1 回答 1

1

它会导致 Chrome 出现错误,因为您的原始代码无效。您实际上在做的是分配alert("Test")to的结果window.testalertreturn undefined,因此当您稍后尝试调用test时,它引用undefined而不是函数。您还缺少一个左括号,尽管这并没有引起这里的问题。

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

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

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

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

于 2015-06-11T08:08:38.493 回答