2016-11-25 57 views
7

我的問題是,爲什麼下面是不正確javascript意外令牌。用`{}的ToString()`

function hello() { 
    {}.toString();//Unexpected token . 
} 

但正確使用return

function hello() { 
    return {}.toString(); 
} 

不知道分析器是如何工作的版本不正確,是{}處理過作爲BlockStatement?如果是,那爲什麼?

感謝詳細的解釋

+0

更多語法正確的例子:'變種X = {} .toString(); ({})的toString(); ({}的ToString()); false || {} .toString();'所以你的猜測可能是正確的 –

回答

8

不知道分析器是如何工作的版本不正確,則{}視爲塊語句?

沒錯。

...爲什麼?

純粹是因爲這是語法設計的方式。 {在解析器期待語句(即it is there)時啓動塊和啓動對象初始值設定項之間不明確,因此語法表示它啓動塊。因此,{開始一個塊,}結束它,並且.沒有意義,因爲解析器正在期待一個語句(或關閉函數體的})。

但在第二個例子中。因爲{return之後,解析器是expecting an expression(不是語句),所以{啓動了對象初始值設定項。

任何使解析器處於預期表達式的狀態將使它將{視爲對象初始值設定項的開始。括號在這種情況下,常用的有:

function hello() { 
    ({}).toString(); 
} 

當然,因爲你不使用的toString結果那個函數沒有做任何事情,...

+0

謝謝@ T.J。 ,你剛剛救了我。即使我有一些假設,它幾乎殺了我。非常感謝您的幫助 – Howard