我的問題是,爲什麼下面是不正確javascript意外令牌。用`{}的ToString()`
function hello() {
{}.toString();//Unexpected token .
}
但正確使用return
:
function hello() {
return {}.toString();
}
不知道分析器是如何工作的版本不正確,是{}
處理過作爲BlockStatement
?如果是,那爲什麼?
感謝詳細的解釋
我的問題是,爲什麼下面是不正確javascript意外令牌。用`{}的ToString()`
function hello() {
{}.toString();//Unexpected token .
}
但正確使用return
:
function hello() {
return {}.toString();
}
不知道分析器是如何工作的版本不正確,是{}
處理過作爲BlockStatement
?如果是,那爲什麼?
感謝詳細的解釋
不知道分析器是如何工作的版本不正確,則{}視爲塊語句?
沒錯。
...爲什麼?
純粹是因爲這是語法設計的方式。 {
在解析器期待語句(即it is there)時啓動塊和啓動對象初始值設定項之間不明確,因此語法表示它啓動塊。因此,{
開始一個塊,}
結束它,並且.
沒有意義,因爲解析器正在期待一個語句(或關閉函數體的}
)。
但在第二個例子中。因爲{
在return
之後,解析器是expecting an expression(不是語句),所以{
啓動了對象初始值設定項。
任何使解析器處於預期表達式的狀態將使它將{
視爲對象初始值設定項的開始。括號在這種情況下,常用的有:
function hello() {
({}).toString();
}
當然,因爲你不使用的toString
結果那個函數沒有做任何事情,...
謝謝@ T.J。 ,你剛剛救了我。即使我有一些假設,它幾乎殺了我。非常感謝您的幫助 – Howard
更多語法正確的例子:'變種X = {} .toString(); ({})的toString(); ({}的ToString()); false || {} .toString();'所以你的猜測可能是正確的 –