JavaScript有一個功能statement,這是「標準」的方式來聲明一個函數,與語法:
function name([param1, 2...]) {
statements
}
而且還有一個功能operator,看起來一樣的函數聲明除了名稱是可選的,它不是用來作爲自己的一個聲明,但其中一個表達預計在下面兩個例子:
// declare variable name that references a function created by expression
var name = function([param1, 2...]) { statements };
// call someOtherFunction that expects a function as a parameter
someOtherFunction(function() { });
(有很多其他的方式來使用函數表達式。)
如果試圖對自身行匿名函數,而不在括號包裹它,它會認爲是一個功能聲明,因而是一個語法錯誤,因爲沒有名字。用括號括起來意味着它將被視爲表達式在parens中,而不是作爲一個語句,所以名稱是可選的。如果你將函數表達式的結果賦值給一個變量或者以其他方式使用它(就像在上面的例子中那樣),那麼你不需要括號。
因此,最後得到問題中提到的語法:一旦你有parens並且你的函數被視爲一個表達式,你可以使用你發佈的兩種語法之一來調用它。首先,調用parens的「outside」意味着第一組parens將評估爲具有內部表達式的值,這恰好是可以調用的函數。第二,調用「內部」意味着函數表達式將被調用,然後周圍的parens將評估任何函數返回。
無論哪種方式,函數的返回值都會被丟棄,因爲您不會將其分配給任何東西。
(最後提示:函數表達式可以有一個名稱,以便函數可以遞歸調用本身)
http://jsbin.com/orobok/edit#javascript,html – weisjohn
請參見http://計算器.com/questions/3384504 /括號內的自動執行位置 - 匿名 - javascript-functions –