通常,我們呼叫乙個方法的方式就是 functionname()
但是,如果我們嘗試為乙個「定義函式」末尾加上(),解析器是無法理解的。
functionmsg()();
//解析器是無法理解的
定義函式的呼叫方式應該是 msg() ; 那為什麼將函式體部分用()包裹起來就可以了呢?
原來,使用括號包裹定義函式體,解析器將會以函式表示式的方式去呼叫定義函式。也就是說,任何能將函式變成乙個函式表示式的作法,都可以使解析器正確的呼叫定義函式。而 ! 就是其中乙個,而 + - || 都有這樣的功能。
任何消除函式宣告和函式表示式間歧義的方法,都可以被解析器正確識別。比如:
var i = function()(); //undefined
1 && function()(); //
true
1, function()(); //
undefined
賦值,邏輯,甚至是逗號,各種操作符都可以告訴解析器,這個不是函式宣告,它是個函式表示式。並且,對函式一元運算可以算的上是消除歧義最快的方式,感嘆號只是其中之一,如果不在乎返回值,這些一元運算都是有效的:
!function()() //true
+function()() //
nan-function()() //
nan~function()() //
-1
甚至下面這些關鍵字,都能很好的工作:
voidfunction()() //
undefined
newfunction()() //
object
delete
function()() //
true
最後,括號做的事情也是一樣的,消除歧義才是它真正的工作,而不是把函式作為乙個整體,所以無論括號括在宣告上還是把整個函式都括在裡面,都是合法的:
(function())() //undefined
(function()()) //
undefined
說了這麼多,實則在說的一些都是最為基礎的概念——語句,表示式,表示式語句,這些概念如同指標與指標變數一樣容易產生混淆。雖然這種混淆對程式設計無表徵影響,但卻是一塊絆腳石隨時可能因為它而頭破血流。
function與感嘆號
如果在function之前加上感嘆號 會怎麼樣?比如下面的 function true 在控制台執行後得到的值時true,為什麼是true這很容易理解,因為這個匿名函式沒有返回值,預設返回的就是undefined,求反的結果很自然的就是true。所以問題並不在於結果值,而是在於,為什麼求反操作能夠讓...
function與感嘆號
最近有空可以讓我靜下心來看看各種 function與感嘆號的頻繁出現,讓我回想起2個月前我回杭州最後參加團隊會議的時候,西子劍影丟擲的一樣的問題 如果在function之前加上感嘆號 會怎麼樣?比如下面的 function true 在控制台執行後得到的值時true,為什麼是true這很容易理解,因...
function與感嘆號
function true 在控制台執行後得到的值時true,為什麼是true這很容易理解,因為這個匿名函式沒有返回值,預設返回的就是undefined,求反的結果很自然的就是true。所以問題並不在於結果值,而是在於,為什麼求反操作能夠讓乙個匿名函式的自調製的合法?平時我們可能對新增括號來呼叫匿名...