【问题标题】:AngularJS application with RequireJS gives "use strict" error in Safari & Firefox带有 RequireJS 的 AngularJS 应用程序在 Safari 和 Firefox 中出现“使用严格”错误
【发布时间】:2016-08-04 20:46:24
【问题描述】:

所以我已经超越了一个非常全面的 AngularJS 应用程序,它使用 RequireJS 进行模块化,还使用 ​​Grunt(RequireJS 优化器插件)编译代码并缩小它。

缩小的代码在 Firefox 中给我以下错误:

“SyntaxError:在严格模式代码中,函数只能在顶层或直接在另一个函数中声明”

在 Safari 中:

“SyntaxError:严格模式不允许在词法嵌套语句中声明函数。”

这是代码的第一部分:

function(e, t, n) {
"use strict";

function r(e) {
    return function() {
        var t = arguments[0],
            n = "[" + (e ? e + ":" : "") + t + "] ",
            r = arguments[1],
            i = arguments,
            s = function(e) {
                return typeof e == "function" ? e.toString().replace(/ \{[\s\S]*$/, "") : typeof e == "undefined" ? "undefined" : typeof e != "string" ? JSON.stringify(e) : e
            },
            o, u;
        o = n + r.replace(/\{\d+\}/g, function(e) {
            var t = +e.slice(1, -1),
                n;
            if (t + 2 < i.length) return n = i[t + 2], typeof n == "function" ? n.toString().replace(/ ?\{[\s\S]*$/, "") : typeof n == "undefined" ? "undefined" : typeof n != "string" ? ht(n) : n;
            return e
        }), o = o + "\nhttp://errors.angularjs.org/1.2.29/" + (e ? e + "/" : "") + t;
        for (u = 2; u < arguments.length; u++) o = o + (u == 2 ? "?" : "&") + "p" + (u - 2) + "=" + encodeURIComponent(s(arguments[u]));
        return new Error(o)
    }
}

function E(e) {
    if (e == null || z(e)) return !1;
    var t = e.length;
    return e.nodeType === 1 && t ? !0 : j(e) || q(e) || t === 0 || typeof t == "number" && t > 0 && t - 1 in e
}

function S(e, t, n) {
    var r;
    if (e)
        if (R(e))
            for (r in e) r != "prototype" && r != "length" && r != "name" && (!e.hasOwnProperty || e.hasOwnProperty(r)) && t.call(n, e[r], r);
        else if (q(e) || E(e))
        for (r = 0; r < e.length; r++) t.call(n, e[r], r);
    else if (e.forEach && e.forEach !== S) e.forEach(t, n);
    else
        for (r in e) e.hasOwnProperty(r) && t.call(n, e[r], r);
    return e
}

"

代码在编译、连接和缩小之前运行良好。

有人对如何解决这个问题有任何建议吗?

【问题讨论】:

    标签: javascript angularjs gruntjs requirejs


    【解决方案1】:

    这是一个严重的错误,因为它涉及到特定于浏览器的 ECMAScript 实现的细微差别。如果您有兴趣,这里有一个快速细分:ES5 Strict Mode Requirements

    这个错误基本上可以归结为一个函数被声明在它不应该在的地方。这通常只是由浏览器“处理”,但向前推进(在strict mode 中)浏览器将停止对此提供帮助并简单地抛出一个错误。解决这个问题的简单方法是永远不要在没有将函数分配给局部变量的情况下声明它。 let fn = function(){...} 而不是 function fn(){...}。您仍然使用相同的函数 [例如:var a = fn()],但它现在与您分配给它的变量的范围相关联。这使得理解和调试更容易,因为它遵循与任何其他变量声明相同的规则。它在被声明之前是未定义的(所以在声明之前不要调用它),它只能在它的范围内使用(所以如果你在一个函数中声明它,它只能在那个函数中使用),它可以随时被覆盖或更改。

    我没有看到您发布的代码引发的错误,因此它可能发生在此模块的更深处。可以发完整的文件吗?

    【讨论】:

    • 感谢您的快速回答。基本上我美化了 js,发现一些添加的代码确实是 if 语句中的函数声明。我不熟悉这种使用 strict 的需求,特别是因为我不习惯使用 strict 并且这是我正在处理的其他人的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多