2012-06-03 136 views
1

Possible Duplicate:
What do parentheses surrounding a JavaScript object/function/class declaration mean?圓括弧的JavaScript

如下使用時,是什麼在JS圓括號中的含義是:

<script> 
(
function foo(){ alert("Hello world!")}() 
) 
</script> 

它將按預期並顯示的 「Hello world!」。但是,如果我決絕的括號

<script> 

function foo(){ alert("Hello world!")}() 

</script> 

鉻控制檯生成錯誤「未捕獲的SyntaxError:意外的標記)」。 我不明白爲什麼會發生這種情況......有什麼幫助?

+0

更好的重複:[解釋JavaScript的封裝的匿名函數語法](http://stackoverflow.com/questions/1634268/explain-javascripts-encapsulated-anonymous-function-syntax)。 –

回答

4
(
function foo(){ alert("Hello world!");} 
) 

在上面的線,我們定義一個函數foo這被解釋爲一個函數對象。

(
function foo(){ alert("Hello world!");} 
)(); 

我們現在調用函數(使用函數對象)。

備註:您使用的方法其實是錯誤的。以上是使用它們的正確方法。

UPDATE

其實,這是一個很好的問題。我繞了一段時間,並得出以下結論。 (請注意,我可能是一個很大的錯誤,請告訴我,如果是的話)。

它關於JS引擎解析代碼的方式。當它解析function foo(){ alert("Hello world!");}時,它將其視爲函數聲明。它(可能)不是一個調用函數的語句(可能是根據語言的語法)。

但是,下面的代碼工作

<script type=text/javascript> 
[function foo(){ alert("Hello world!");}()] 
</script> 

和這一個了:

<script type=text/javascript> 
1,function foo(){ alert("Hello world!");}() 
</script> 

(明明一個在上面的問題)

我會以爲這是因爲JS解析器期望在(..)之內的一個表達式,即當它第一次看到一個(。這與上面第二個代碼中的comma-operator一樣,以及在初始化數組時(在第一個代碼中)也會發生。但是當沒有讓代碼(函數)看起來像表達式的令牌時,解析會在遇到最後的()時引發錯誤。

更新2(非常感謝費利克斯·克林此):

請參閱有關語法in CMS's response的部分的詳細說明。這個問題的答案很清楚地解釋什麼,我說上面即的JS解析如何區分一個函數聲明函數表達式

(
function foo(){ alert("Hello world!")}() 
) 

之間是一個函數表達式。因此它執行沒有任何錯誤。

function foo(){ alert("Hello world!")}<<STOP>>() 

的內容,直到<<STOP>>被解析爲函數聲明,而不是作爲一個函數表達式。因此,當它在<<STOP>>之後遇到第一個(時,它會標記錯誤。

+0

問題是要問爲什麼刪除外部括號會導致錯誤。你沒有解釋過。 – Quentin

+0

在原始問題中使用括號的方式沒有任何問題(顯然,從拋出作爲問題主題的錯誤的第二個示例)。 – Quentin

+0

@Quentin是的,你是對的。更新它。 – SuperSaiyan