2012-09-08 29 views
8

如果我試圖執行一個腳本,其唯一的源代碼行的對象:爲什麼匿名函數本身在JavaScript中有語法錯誤?

{prop:'value'} 

它解析罰款(在V8和UglifyJS)。同樣,我可以將自己的字符串或數字作爲源代碼,並且沒有語法錯誤報告。

然而,無論是V8和UglifyJS抱怨這個對自己:

function(){} 

我得到Uncaught SyntaxError: Unexpected token (

爲什麼當第一個例子中的對象很好時會中斷?函數不是JavaScript中的對象嗎?

我認識到聲明一個匿名函數而不執行它不會做任何事情;這不是問題。我想知道它爲什麼會導致解析錯誤。

+0

那麼它缺少一個函數名稱,因爲聲明一個函數遵循規則'function [name](){[code]}'所以實際的問題可能是:爲什麼有特殊情況可以創建一個匿名函數? – yoshi

+0

「匿名函數」更正確地說是沒有可選名稱的函數表達式(參見[FunctionExpression](http://ecma-international.org/ecma-262/5.1/#sec-A.5))。 – RobG

+0

什麼是有趣的只是添加一些運算符,這工作:) '!function(){}; + function(){};' – abuduba

回答

11

從ECMAScript的規範,對錶達式語句12.4節:

注意的ExpressionStatement不能以大括號開始,因爲這可能使含糊帶。另外,ExpressionStatement不能以function關鍵字開頭,因爲這可能會使其與函數聲明不一致。

儘管函數只是對象,但請記住,您可以自行聲明函數,而無需在表達式中真正使用它們的對象。這就是含糊不清的地方。當然,你永遠無法自己聲明一個匿名函數(因爲無論如何你都無法引用它),但是由於我在規範中找不到任何區分匿名函數和命名函數聲明的東西,我懷疑這個適用於兩者。

爲了解決你需要用它在括號中的不確定性,所以它總是會被視爲一種表達:

(function(){}) 
+0

你是對的,包裝在圓括號的作品。我沒有看到'function(){}'是如何模糊的。還有什麼意思? – Flash

+2

@安德魯 - 它可能是模糊的,因爲它可能是一個函數表達式。請注意,函數聲明在執行任何代碼之前處理,函數表達式在代碼執行後處理。 – RobG

+0

@RobG你的意思是它可能是一個函數聲明?它怎麼可能 - 它沒有名字。 – Flash

5

{prop:'value'}不會被解析爲一個對象,只是解析爲一個塊,其中有一個標籤prop

您需要()將其作爲表達式進行解析。

({prop: 'value'})將被解析爲對象表達式。

(function(){})將被解析爲函數表達式。

相關問題