function與感嘆號

2022-08-14 20:24:14 字數 1289 閱讀 9317

通常,我們呼叫乙個方法的方式就是 functionname()

但是,如果我們嘗試為乙個「定義函式」末尾加上(),解析器是無法理解的。

function

msg()();

//解析器是無法理解的

定義函式的呼叫方式應該是 msg() ; 那為什麼將函式體部分用()包裹起來就可以了呢?

原來,使用括號包裹定義函式體,解析器將會以函式表示式的方式去呼叫定義函式。也就是說,任何能將函式變成乙個函式表示式的作法,都可以使解析器正確的呼叫定義函式。而 ! 就是其中乙個,而 + - || 都有這樣的功能。

任何消除函式宣告和函式表示式間歧義的方法,都可以被解析器正確識別。比如:

var i = function()();        //

undefined

1 && function()(); //

true

1, function()(); //

undefined

賦值,邏輯,甚至是逗號,各種操作符都可以告訴解析器,這個不是函式宣告,它是個函式表示式。並且,對函式一元運算可以算的上是消除歧義最快的方式,感嘆號只是其中之一,如果不在乎返回值,這些一元運算都是有效的:

!function()()        //

true

+function()() //

nan-function()() //

nan~function()() //

-1

甚至下面這些關鍵字,都能很好的工作:

void

function()() //

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。所以問題並不在於結果值,而是在於,為什麼求反操作能夠讓乙個匿名函式的自調製的合法?平時我們可能對新增括號來呼叫匿名...