2016-04-13 2 views
0

So habe ich eine ziemlich umfassende AngularJS-Anwendung, die RequireJS zu modularisieren verwendet und auch Grunt (RequireJS Optimizer-Plugin), um den Code zu kompilieren und zu minimieren.AngularJS Anwendung mit RequireJS gibt "verwenden strenge" Fehler in Safari & Firefox

Der minimierte Code gibt mir die folgenden Fehler in Firefox:

"Syntaxerror: im Strict-Modus-Code, können Funktionen nur auf höchster Ebene deklariert werden oder unmittelbar innerhalb einer anderen Funktion"

Und in Safari :

"SyntaxError: Strict-Modus lässt Funktionsdeklarationen in einer lexikalisch geschachtelten Anweisung nicht zu."

Hier ist der erste Teil des Codes.

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 
} 

"

Der Code ist funktioniert gut, bevor kompiliert, concatened und minimierte werden

Wer noch keine Ratschläge, was zu versuchen zu tun, um dies zu beheben?

Antwort

0

Dies ist ein schwerer Fehler, weil es in die Nuance der Browser-spezifischen Implementierungen von ECMAScri bekommen pt. Hier ist eine kurze Zusammenfassung, wenn Sie interessiert sind: ES5 Strict Mode Requirements.

Der Fehler läuft im Wesentlichen auf die Tatsache ab, dass eine Funktion deklariert wird, wo sie nicht sein sollte. Dies wird oft nur vom Browser "gehandhabt", aber nach vorne gehend (und in strict mode) hört der Browser damit auf und wirft einfach einen Fehler. Die einfache Lösung besteht darin, niemals eine Funktion zu deklarieren, ohne sie einer lokalen Variablen zuzuordnen. let fn = function(){...} anstatt function fn(){...}. Sie verwenden die Funktion immer noch dieselbe [ex: var a = fn()], aber jetzt ist sie an den Gültigkeitsbereich der Variablen gebunden, der Sie sie zugewiesen haben. Dies erleichtert das Verständnis und das Debuggen, da es denselben Regeln wie jede andere Variablendeklaration folgt. Es ist undefiniert, bis es deklariert wurde (also nicht vor der Deklaration aufrufen), es ist nur innerhalb seines Gültigkeitsbereichs verwendbar (wenn Sie es also in einer Funktion deklarieren, ist es nur innerhalb dieser Funktion verfügbar), und es kann jederzeit überschrieben oder geändert werden.

Ich sehe nicht, dass der Fehler von dem Code, den Sie gepostet haben, ausgegeben wird, so dass er wahrscheinlich irgendwo tiefer in diesem Modul auftritt. Können Sie die vollständige Datei posten?

+1

Vielen Dank für Ihre schnelle Antwort. Im Grunde verschönerte ich die js und entdeckte, dass einige hinzugefügten Code tatsächlich Funktionsdeklarationen innerhalb einer if-Anweisung war. Ich war nicht mit dieser Forderung der Verwendung strikt vertraut, vor allem da ich nicht gewohnt bin, streng zu verwenden und dieser jemand elses Code, an dem ich arbeite. – Aman

Verwandte Themen