(
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>>
之後遇到第一個(
時,它會標記錯誤。
更好的重複:[解釋JavaScript的封裝的匿名函數語法](http://stackoverflow.com/questions/1634268/explain-javascripts-encapsulated-anonymous-function-syntax)。 –