2013-08-27 53 views
5

爲什麼匿名的JavaScript函數調用!功能VS功能

function(){ alert("test123");}() 

產生SyntaxError: Unexpected token (

!function(){ alert("test123");}() 

警報 「test123」

+4

http://benalman.com/news/2010/11/immediately-invoked-function-expression/ – zerkms

+0

@zerkms您應該將其作爲回答,因爲它實際上很好地解釋了問題的核心。 – Kippie

+1

來吧,有_has_是重複的... –

回答

3

這是因爲通過添加!符號將聲明轉換爲表達式並立即調用它。 通過包圍你的函數放在括號中你會做第一個例子中沒有錯誤的工作:

(function(){ alert("test123");})() 

使其更清晰,你可以想想第一次表達類似:

if (false || !function(){ return false; }()) 


而作爲@zerkms注意到有對 Immediately-invoking functions的完整解釋。

+0

太糟糕了我不能寫出正確的答案,但是......「標識符」不是正確的術語。區別是在定義和表達之間。前者不能立即調用。 –

+1

正確的軌道,但錯誤的解釋。 !!將聲明轉換爲表達式。 – slebetman

+0

我可以定義一個函數並且不會調用它:'!function(){alert(「不會被調用」)}' –