我是Grunt的新手,也是grunt-contrib-uglify的新手。我创建了一个测试JavaScript文件:
function global(window) {
window.test = alert("Test");
test();
})(window);
当它被证实时,它显示为
!function(a){a.test=alert("Test"),test()}(window);
我对两件事感到困惑:
("Test")
和test
之间有逗号而不是分号?当我在Chrome中运行时,会出现警报,但控制台会抱怨Uncaught TypeError: test is not a function
。当我通过JSHint运行它时,它会报告:“期望一个赋值或函数调用,而是看到一个表达式。”
grunt-contrib-uglify是否利用了Chrome和我都不完全理解的JavaScript方面?
答案 0 :(得分:1)
由于原始代码无效,因此导致Chrome出错。您实际执行的操作是将alert("Test")
的结果分配给window.test
。 alert
会返回undefined
,因此当您稍后尝试调用test
时,它会引用undefined
而不是函数。你也错过了一个左括号,虽然这不会引起问题。
看起来您要做的是创建一个代理alert
函数,该函数将使用预定义的输入参数调用它。您可以使用bind()函数执行此操作,如下所示:
(function (window) {
window.test = alert.bind(undefined, 'Test');
test();
})(window);
以上应该会产生您的预期结果。
至于为什么它使用逗号而不是分号,可能是因为缩小的代码验证了表达式(参见expressions vs statements),并且表达式中不允许使用分号,而逗号是。