2016-09-14 43 views
8

雖然試圖調試一些錯誤的一段JavaScript代碼,我發現了一個線,看起來像在源文件中的明顯錯誤:爲什麼false ++在Firefox中產生一個SyntaxError而在Chrome中產生ReferenceError?

false++; 

我不爲已瞭解爲什麼這種說法在所有瀏覽器的行爲不同。

  • 在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):*如果LeftHandSideExpression的IsValidSimpleAssignmentTarget爲false,則爲早期引用錯誤。*後綴運算符試圖修改該值,* false *是不可變的,因此不是有效的簡單賦值目標。 – RobG

回答

5

Chrome似乎是最新的。

  • ES6ES7一個ReferenceError試圖assign to a primary expression這是一個文字(如false)不是標識符時被拋出。
  • ES5早期錯誤(這通常是SyntaxError多個)未指定的類型的被拋出分配「上的任何值,對於這個早期可以判定該值是不是一個Reference」,雖然if it would happen一個ReferenceError將被拋出所以有人可能會爭辯說早期的錯誤也應該是這種類型。
  • 在ES3,錯誤條件的描述類似於ES5,但它只是說「實現可能 [原文如此] 治療以下幾種運行時錯誤的任何實例作爲一個語法錯誤,因此 早報告「。
  • 在ES1和ES2中,根本沒有錯誤類型,也沒有任何異常處理,並且指定給不是僅供參考的內容稱爲「生成運行時錯誤」。儘管如果他們能夠證明在任何情況下都會發生錯誤,那麼實現可以在編譯時儘早報告。

雖然在Firefox處理錯誤可以通過ES5或ES3措辭被原諒的行爲的Internet Explorer拋出一個運行時SyntaxError不符合任何這些。但是,微軟計劃到fix this in Chakra。有關進一步討論,請參閱https://github.com/tc39/ecma262/issues/257https://github.com/tc39/ecma262/issues/691

0

只是猜測,但也許Firefox首先檢查語法錯誤,& Chrome首先檢查參考錯誤。第一個錯誤是拋出,&不會進一步。錯誤的主要原因是false是布爾值,而不是整數或數值,所以不能遞增或遞減。沒有看到源代碼,我會嘗試將false更改爲var falseCount之類的東西。

相關問題