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

时间:2015-06-11 06:15:05

标签: javascript grunt-contrib-uglify

我是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方面?

1 个答案:

答案 0 :(得分:1)

由于原始代码无效,因此导致Chrome出错。您实际执行的操作是将alert("Test")的结果分配给window.testalert会返回undefined,因此当您稍后尝试调用test时,它会引用undefined而不是函数。你也错过了一个左括号,虽然这不会引起问题。

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

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

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

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