【问题标题】:Grunt Uglify produces code that browsers do not agree withGrunt Uglify 生成浏览器不同意的代码
【发布时间】:2015-06-11 16:08:38
【问题描述】:

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

【问题讨论】:

    标签: javascript grunt-contrib-uglify


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多