2 回答
TA貢獻(xiàn)1804條經(jīng)驗 獲得超8個贊
我們來看看語言語法吧?第12節(jié),聲明:
Statement : Block VariableStatement EmptyStatement ExpressionStatement ...lots of other stuff...
這是一種非常奇特的方式,可以說語句可以是塊,變量語句,空語句,表達(dá)式語句或許多其他東西。請注意,第一個選項是“Block”:
Block :
{ StatementList(opt) }StatementList :
Statement
StatementList Statement再一次,這是一種奇特的方式,說一個塊是一個{,可選地后跟一堆語句,然后是一個}。
這就是你在你的例子中看到的:在JavaScript解析器認(rèn)為你擁有的東西可能是一個對象文字(在某個地方被定義ExpressionStatement,第四個是'Statement'可能是)之前,它首先認(rèn)為你有一個'Block ”。
編輯:如果需要,您可以在JavaScript引擎的源代碼中看到它:
在V8,Chrome的JavaScript引擎中,我們進(jìn)入了
Parser::ParseStatement。它檢查的第一件事是我們是否在a{,如果是,則解析為block。在Firefox的JavaScript引擎SpiderMonkey中,我們
Parser::statement再次看到第一次檢查是針對a{并將其解析為塊語句。
關(guān)于你的第二個問題,關(guān)于這個問題已經(jīng)詳細(xì)介紹了??偨Y(jié)一句話:Node.js將您的輸入視為表達(dá)式(因此它不能是“阻止”),而Firebug / Chrome開發(fā)工具將其視為“語句”。
TA貢獻(xiàn)1827條經(jīng)驗 獲得超9個贊
當(dāng)新語句中的第一個標(biāo)記為{,則將{}其解釋為空塊。
(實際上當(dāng)然{出現(xiàn)在類似ifor 之類的header子句之后while,那么它{}也是一個空塊,但那不是有趣的情況。)
因此,在任何其他上下文中,比如說一個函數(shù)的參數(shù):
foo({});該{}被解釋為一個空對象文字。
這種情況類似于function關(guān)鍵字在語句中的第一件事時被區(qū)別對待的方式。語法有歧義,解析器用固定規(guī)則解決問題。
添加回答
舉報
