2016-09-14 2 views
8

При попытке отладить некоторый дефектный кусок JavaScript, я нашел строку, которая выглядит как очевидная ошибка в исходном файле:Почему false ++ создает SyntaxError в Firefox, но ReferenceError в Chrome?

false++; 

То, что я не undestand почему это утверждение ведет себя по-разному во всех браузерах.

  • В Chrome у меня есть ReferenceError, и весь скрипт не запускается.
  • В Firefox я получаю SyntaxError, и весь скрипт не запускается.
  • В Internet Explorer я получаю SyntaxError, и сценарий запускается только до строки, где происходит ошибка.

Возможно ли, что различным браузерам разрешено обрабатывать один и тот же сломанный JavaScript по-разному?

Я знаю, что такое ошибка и как ее исправить, но не должен ли, по крайней мере, тип ошибки задаваться спецификацией?

+0

Что говорит спецификация? – Teemu

+3

@Teemu Я не знаю. Вы? – Lynn

+3

Должна быть эталонная ошибка, см. [* ECMA-262 §12.4.1 *] (http://ecma-international.org/ecma-262/7.0/index.html#sec-update-expressions-static-semantics -early-errors): * Это ранняя ссылочная ошибка, если IsValidSimpleAssignmentTarget LeftHandSideExpression является ложным. * Оператор postfix пытается изменить значение, * false * является неизменным, поэтому не является допустимым простым назначением назначения. – RobG

ответ

5

Хром, похоже, обновлен.

  • В ES6 и ES7ReferenceError выбрасывается при попытке assign to a primary expression, что является буквальным (например, false) не является идентификатором.
  • В ES5 ранней ошибке (которые обычно является SyntaxError s) неопределенного типа выбрасываются для выполнения заданий «на любом значении, для которых раннего определение может быть сделано, что значение не является Reference», хотя if it would happenReferenceError бы быть брошенным, поэтому можно утверждать, что ранняя ошибка должна быть и того типа.
  • В ES3, описание состояния ошибки похоже на ES5, но это только говорится, что "реализация может [так!] лечение любого экземпляра следующих типов ошибок во время выполнения в качестве ошибки синтаксиса и поэтому сообщите об этом в начале ".
  • В ES1 и ES2 не было типов ошибок и обработки исключений вообще, а присвоение чему-то, что не является ссылкой, называется «генерирует ошибку времени выполнения». Реализациям разрешалось сообщать о них раньше времени компиляции, хотя, если бы они могли доказать, что ошибка произойдёт при любых обстоятельствах.

Хотя обработка в Firefox ошибка может быть освобожден от редакции ES5 или ES3, поведение Internet Explorer метания выполнения SyntaxError не соответствует ни одному из них. Однако Microsoft планирует fix this in Chakra. Для дальнейшего обсуждения см. https://github.com/tc39/ecma262/issues/257 и https://github.com/tc39/ecma262/issues/691.

0

Просто догадайтесь, но, возможно, Firefox сначала проверяет наличие синтаксических ошибок, & Сначала проверяет исходные ошибки. Первая ошибка выбрасывается, & не идет дальше. Основная причина ошибки заключается в том, что false является логическим, а не целочисленным или числовым значением, поэтому его нельзя увеличивать или уменьшать. Не видя исходный код, я бы попытался изменить false на что-то вроде var falseCount.