2 回答

TA貢獻1804條經驗 獲得超8個贊
我們來看看語言語法吧?第12節,聲明:
Statement : Block VariableStatement EmptyStatement ExpressionStatement ...lots of other stuff...
這是一種非常奇特的方式,可以說語句可以是塊,變量語句,空語句,表達式語句或許多其他東西。請注意,第一個選項是“Block”:
Block : { StatementList(opt) }StatementList : Statement StatementList Statement
再一次,這是一種奇特的方式,說一個塊是一個{
,可選地后跟一堆語句,然后是一個}
。
這就是你在你的例子中看到的:在JavaScript解析器認為你擁有的東西可能是一個對象文字(在某個地方被定義ExpressionStatement
,第四個是'Statement'可能是)之前,它首先認為你有一個'Block ”。
編輯:如果需要,您可以在JavaScript引擎的源代碼中看到它:
在V8,Chrome的JavaScript引擎中,我們進入了
Parser::ParseStatement
。它檢查的第一件事是我們是否在a{
,如果是,則解析為block。在Firefox的JavaScript引擎SpiderMonkey中,我們
Parser::statement
再次看到第一次檢查是針對a{
并將其解析為塊語句。
關于你的第二個問題,關于這個問題已經詳細介紹了??偨Y一句話:Node.js將您的輸入視為表達式(因此它不能是“阻止”),而Firebug / Chrome開發工具將其視為“語句”。

TA貢獻1827條經驗 獲得超9個贊
當新語句中的第一個標記為{
,則將{}
其解釋為空塊。
(實際上當然{
出現在類似if
or 之類的header子句之后while
,那么它{}
也是一個空塊,但那不是有趣的情況。)
因此,在任何其他上下文中,比如說一個函數的參數:
foo({});
該{}
被解釋為一個空對象文字。
這種情況類似于function
關鍵字在語句中的第一件事時被區別對待的方式。語法有歧義,解析器用固定規則解決問題。
添加回答
舉報