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);
我对两件事感到困惑:
- 为什么
("Test")
和 test
之间是逗号而不是分号?
- 这段代码如何产生预期的结果?
当我在 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.test
。 alert
returns undefined
,因此当您稍后尝试调用 test
时,它引用 undefined
而不是函数。您还遗漏了一个左括号,但这并没有导致此处出现问题。
看起来您想要做的是创建一个代理 alert
函数,该函数将使用预定义的输入参数调用它。您可以使用 bind() 函数来执行此操作,如下所示:
(function (window) {
window.test = alert.bind(undefined, 'Test');
test();
})(window);
以上应该会产生您预期的结果。
至于为什么它使用逗号而不是分号,可能是因为缩小代码验证了一个表达式(参见expressions vs statements),并且表达式中不允许使用分号,而逗号是允许的。
我是 G运行t 和 g运行t-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 运行 它时,它报告:"Expected an assignment or function call and instead saw an expression."
g运行t-contrib-uglify 是否利用了 JavaScript 中 Chrome 和我都不完全理解的方面?
它会导致 Chrome 出错,因为您的原始代码无效。您实际做的是将 alert("Test")
的结果分配给 window.test
。 alert
returns undefined
,因此当您稍后尝试调用 test
时,它引用 undefined
而不是函数。您还遗漏了一个左括号,但这并没有导致此处出现问题。
看起来您想要做的是创建一个代理 alert
函数,该函数将使用预定义的输入参数调用它。您可以使用 bind() 函数来执行此操作,如下所示:
(function (window) {
window.test = alert.bind(undefined, 'Test');
test();
})(window);
以上应该会产生您预期的结果。
至于为什么它使用逗号而不是分号,可能是因为缩小代码验证了一个表达式(参见expressions vs statements),并且表达式中不允许使用分号,而逗号是允许的。