2016-09-14 6 views
8

Bei dem Versuch, einige fehlerhafte Stück JavaScript zu debuggen, fand ich eine Linie, die in einer Quelldatei wie eine offensichtliche Fehler aussieht:Warum erzeugt false ++ in Firefox einen SyntaxError, in Chrome aber einen ReferenceError?

false++; 

Was undestand ich nicht wissen, ist, warum diese Aussage in allen Browsern anders verhält.

  • In Chrome bekomme ich einen ReferenceError und das ganze Skript wird nicht ausgeführt.
  • In Firefox, erhalte ich eine Syntax und das ganze Skript ausgeführt wird nicht.
  • im Internet Explorer bekomme ich einen Syntax und das Skript läuft nur bis zur Linie, wo der Fehler auftritt.
  • Ist es von Entwurf, dass verschiedene Browser das gleiche kaputte JavaScript auf unterschiedliche Weise behandeln dürfen?

    Ich weiß, was der Fehler ist und wie es zu beheben, aber sollte nicht zumindest der Fehlertyp von der Spezifikation vorgeschrieben werden?

    +0

    Was sagt der spec? – Teemu

    +3

    @Teemu Ich weiß es nicht. Machst du? – Lynn

    +3

    Es sollte ein Referenzfehler, siehe [* ECMA-262 §12.4.1 *] sein (http://ecma-international.org/ecma-262/7.0/index.html#sec-update-expressions-static-semantics -early-errors): * Es ist ein früher Reference Error, wenn IsValidSimpleAssignmentTarget von LeftHandSideExpression false ist. * Der Postfix-Operator versucht den Wert zu ändern, * false * ist unveränderlich, also kein gültiges einfaches Zuweisungsziel. – RobG

    Antwort

    5

    Chrome scheint aktuell zu sein.

    • In ES6 und ES7 ein ReferenceError wird ausgelöst, wenn auf assign to a primary expression versuchen, die eine wörtliche (wie false) kein Bezeichner ist.
    • In ES5 einen frühen Fehler „kann eine frühe Bestimmung vorgenommen werden, für die auf einen beliebigen Wert, dass der Wert kein Reference ist“ nicht näher bezeichneten Art (die in der Regel SyntaxError s) für Zuweisungen geworfen, obwohl if it would happen ein ReferenceError würde geworfen werden, damit man argumentieren könnte, dass der frühe Fehler auch von diesem Typ sein sollte.
    • In ES3, die Beschreibung der Fehlerbedingung ist ES5 ähnlich, aber es heißt nur, dass "eine Implementierung kann [sic!] behandeln jede Instanz der folgenden Arten von Laufzeitfehlern als Syntaxfehler und deshalb melde es früh ".
    • In ES1 und ES2 gab es keine Fehlertypen und keine Ausnahmebehandlung überhaupt, und die Zuordnung zu etwas, das nicht nur eine Referenz soll „ einen Laufzeitfehler erzeugen“. Implementierungen durften sie jedoch früh zur Kompilierungszeit melden, wenn sie beweisen konnten, dass der Fehler unter allen Umständen passieren würde.

    Während der Fehler in Firefox Handhabung kann durch die ES5 oder ES3 Formulierung entschuldigt werden, das Verhalten von Internet Explorer das Werfen einer Laufzeit SyntaxError nicht eines dieser entsprechen. Microsoft plant jedoch, fix this in Chakra. Für weitere Diskussion, siehe https://github.com/tc39/ecma262/issues/257 und https://github.com/tc39/ecma262/issues/691.

    0

    Nur eine Vermutung, aber vielleicht Firefox sucht zuerst nach Syntaxfehlern, & Chrome überprüft Referenzfehler zuerst. Der erste Fehler wird ausgelöst, & 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.

    Verwandte Themen