4 回答

TA貢獻1936條經驗 獲得超7個贊
js 引擎在執(zhí)行時,遇到 {,至少有兩種選擇,
當做語句塊的開始
當做對象字面量表達式的開始
但是,默認情況下,是當做語句塊的,所以
{}.toString()
會報錯:Unexpected token .
因為實際上瀏覽器執(zhí)行的可能是這樣:
{}//空語句塊
.toString()//另外一條錯誤的語句
如果要讓 js 引擎認為 { 是一個對象字面量表達式的開始,一般就是加 (),這個時候,js 引擎就知道()里的是表達式,所以當做表達式來解析,所以
({}).toString()
就不會報錯;
[].toString()
這個不報錯,很正常,因為這里沒有歧義,肯定是數(shù)組字面量表達式
var a= {}; a.toString()//不報錯
這個不報錯,更正常了,沒有歧義,分號表示有兩條語句,雖然放在同一行,不影響,因為有分號;
我來給你看看書上是怎么說的:
不過具體解析的時候,chrome 還有點特殊的,詳情戳這
JavaScript高級程序設計-第3版-中 p84

TA貢獻1820條經驗 獲得超10個贊
因為{}被解析為代碼語句了,所以跟{}不構成關系,而.toString()不是完整的一行代碼語句了。
括號里不能包含語句,所以被解釋成表達式。
只要能讓{}不產生歧義地認為是表達式,就不會報錯了,例如:
({}).toString();
({}.toString());
1 * {}.toString();
+{}.toString();
~{}.toString();
-{}.toString();
1 / {}.toString();
這也是立即執(zhí)行函數(shù)為什么不報錯的原因。
function(){}(); // function(){}被解析為語句,()內不能為空,所以報錯
(function() {})(); // 通常寫法,可讀性好。后面兩行寫法不推薦
(function() {}());
+function() {}();
new function() {}();
添加回答
舉報