Warum erzeugt false ++ in Firefox einen SyntaxError, in Chrome aber einen ReferenceError?

8

Beim Debuggen eines fehlerhaften Teils von JavaScript habe ich eine Zeile gefunden, die wie ein offensichtlicher Fehler in einer Quelldatei aussieht:

%Vor%

Was ich nicht verstehe ist, warum sich diese Anweisung in allen Browsern anders verhält.

  • In Chrome erhalte ich einen ReferenceError und das gesamte Skript wird nicht ausgeführt.
  • In Firefox bekomme ich einen SyntaxError und das ganze Skript wird nicht ausgeführt.
  • Im Internet Explorer erhalte ich einen SyntaxError und das Skript läuft nur bis zur Zeile, in der der Fehler auftritt.

Ist es von vornherein möglich, dass verschiedene Browser dasselbe kaputte JavaScript auf unterschiedliche Weise behandeln?

Ich weiß, was der Fehler ist und wie er behoben werden kann, aber sollte nicht zumindest der Fehlertyp von der Spezifikation vorgeschrieben werden?

    
Lynn 14.09.2016, 10:35
quelle

2 Antworten

5

Chrome scheint auf dem neuesten Stand zu sein.

  • In ES6 und < a href="http://ecma-international.org/ecma-262/7.0/index.html#sec-update-expressions-static-semantics-early-errors"> ES7 wird ReferenceError geworfen Wenn Sie versuchen, einem primären Ausdruck zuzuweisen , der a Literal (z. B. false ) kein Bezeichner.
  • In ES5 ist ein früher Fehler (normalerweise SyntaxError s) von unspezifiziert type wird für Zuordnungen " auf jeden Wert geworfen, für den eine frühzeitige Feststellung getroffen werden kann, dass der Wert kein Referenz ", obwohl wenn es passieren würde wäre ein ReferenceError So könnte man argumentieren, dass der frühe Fehler auch von diesem Typ sein sollte.
  • In ES3 ist die Beschreibung der Fehlerbedingung ähnlich wie in ES5, sie besagt jedoch nur, dass eine Implementierung [sic!] jede Instanz der folgenden Laufzeitfehler behandeln kann als Syntaxfehler und Melden Sie es daher frühzeitig ".
  • In ES1 und ES2 gab es keine Fehlertypen und überhaupt keine Ausnahmebehandlung, und das Zuweisen zu etwas, das nicht nur eine Referenz ist, sagt zu " erzeuge einen Laufzeitfehler ". Implementierungen durften sie jedoch zum Kompilierungszeitpunkt melden, wenn sie beweisen konnten, dass der Fehler unter allen Umständen auftreten würde.

Während die Fehlerbehandlung in Firefox durch die ES5- oder ES3-Formulierung entschuldigt werden kann, entspricht das Verhalten, dass Internet Explorer eine Laufzeit SyntaxError wirft, keiner von diesen. Microsoft plant jedoch, dies in Chakra zu beheben . Weitere Informationen finden Sie unter Ссылка und Ссылка .

    
Bergi 14.09.2016, 12:24
quelle
0

Nur eine Vermutung, aber vielleicht prüft Firefox zuerst Syntaxfehler, & amp; Chrome prüft zuerst Referenzfehler. Der erste Fehler wird ausgelöst, & amp; geht nicht weiter. Der Hauptgrund für den Fehler ist, dass "false" ein boolescher Wert ist, kein Integer- oder numerischer Wert, daher kann er nicht inkrementiert oder dekrementiert werden. Ohne den Quellcode zu sehen, würde ich versuchen, false in etwas wie var falseCount zu ändern.

    
JimM 14.09.2016 12:40
quelle