4

我在編寫一些JS代碼時發現了一件奇怪的事情。這個編譯錯誤似乎發生在多個瀏覽器上(測試:Chrome,IE,Safari)。我並不急於尋求解決方案,但我想不出爲什麼這個代碼不能編譯:JavaScript編譯錯誤

function fooBar1()//Compiles 
    { 
     return { 
      x: 0, 
      y: 1 
     }; 
    } 
    function fooBar2()//Compiles 
    { 
     return {x: 0, y: 1}; 
    } 
    function fooBar3()//Compiles 
    { 
     return 
     { 
      x: 0 
     }; 
    } 
    function fooBar4()//Does not compile 
    { 
     return 
     { 
      x: 0, 
      y: 1//Uncaught SyntaxError: Unexpected token : 
     }; 
    } 
+1

你嘗試格式化,妥善 - > HTTP:// jsfiddle.net/MauPm/ – adeneo

回答

1

這是由於JavaScript的自動分號插入「功能」。

我把「功能」一詞放在引號中,因爲它實際上什麼都不是,它坦率地說有點災難;這是我所知道的語言中最糟糕的設計決定之一。

基本上,JS語言被設計爲以分號結尾的所有語句,但原始語言設計爲忘記密碼的編碼人員提供了補貼,因此如果它看到沒有分號的換行符,試圖猜測那裏是否應該有一個。

不幸的是,在某些情況下,這會導致模糊和錯誤,並且return語句可能是最糟糕的。

在上例中,正在返回的對象的{return語句後面。這是這種錯誤的經典案例。 JS在return之後自動插入一個分號,並且您打算返回的對象被忽略。

簡單的答案就是不要這樣做。始終將對象放在與return聲明相同的行上。記住return需要返回數據與return語句本身位於同一行(或至少在同一行開始)。

您的第一個示例顯示了最接近您破碎示例並仍然有效的工作。

return { 
    x: 0, 
    y: 1 
}; 

至於最後一個問題,你可能要考慮運行你通過像jsLint的工具,這將拿起這樣的錯誤(和其他潛在問題)JS代碼。

+1

這是不正確的。不管分號如何,return語句不允許行結束符,因爲這條規則在ASI之前適用;所以你嘗試使用對象字面量作爲語句會出錯。還應該提及'fooBar3'只能'編譯',因爲'{x:0}'實際上是一個帶標籤的塊語句,而不是對象字面量。 –

+0

查看ECMAScript規範:http://bclary.com/2004/11/07/#a-7.9.1 –

0

像這樣的錯誤可以真正驅動一個瘋狂的,不是嗎?

我的猜測是JavaScript解析器在fooBar4返回後立即添加一個分號。 (它「認爲」你想讓它有)

至少,當我通過返回後加入分號修改任何你的工作職能,相同的語法錯誤會出現