2016-12-22 107 views
-1

下面的代碼返回,說 「的console.log(...)不是一個函數」爲什麼此分句需要分號?

if (4<5) console.log('hi') 
(4<5) ? console.log('hi') : console.log('bye') 

下面的代碼不會返回任何錯誤

if (4<5) console.log('hi') 
if (4<5) console.log('hi') 

爲什麼這是一個錯誤所以?

+1

三元操作符不能與truthy部分單獨留下。毫無疑問,這是語法。 –

+0

我的不好,只是更新了問題。 – sawa

+1

我沒有收到你的錯誤信息,更新後的代碼 – Liam

回答

5

在第一行末尾沒有分號時,代碼嘗試使用第一個console.log的返回值作爲函數,並使用參數4<5來調用它;如果刪除換行符,這是清晰的:

if (4<5) console.log('hi')(4<5) ? console.log('hi') : console.log('bye') 
//  ^^^^^^^^^^^^^^^^^^^^^^---- looks like calling `console.log` and then 
//         using the result as a function 

有這個潛力你把剩下關閉分號(這意味着你依靠的糾錯mechansim )與表達任何時間聲明。由於表達式語句本質上就是表達式,所以如果語法分析器可以在前面的表達式或語句中使用它們,它將會。


FWIW,astexplorer.net是一個很酷的工具,我最近發現(感謝通天項目)。這是一個交互式語法樹瀏覽器,它可以使用任何幾個解析器來解析你的代碼,並精確告訴你它是如何被解析的。從github賬戶開始,它是由我們自己的Felix Kling開始的。


Quoting Brendan Eich

ASI是(正式地說)一個語法錯誤校正過程。如果你開始編碼,就好像它是一個普遍的重要新行規則,你將會遇到麻煩。

+0

但是TJ,如果是這樣的話,undefined不是函數必須是apt錯誤。不是嗎?因爲'console.log()'會返回undefined。 –

+1

@RajaprabhuAravindasamy:這就是我在我的答案中引用的錯誤所說:「console.log(...)'的結果不是函數。 (這並不是說'console.log'不是一個函數。) –

相關問題