由於語法錯誤,以下代碼不起作用。在某些情況下,爲什麼我們不需要在JavaScript函數定義附近添加一對括號?
function() {
alert('foo')
}()
的jsfiddle URL上面的代碼:http://jsfiddle.net/qr2fr/
此代碼可以通過以下面的方式添加額外的一對圍繞所述函數定義括號被固定。
(function() {
alert('foo')
})()
的jsfiddle URL上面的代碼:http://jsfiddle.net/t6sJs/
但是,下面的JavaScript代碼,是正確和警報字符串「foo」沒有額外的對括號周圍的函數定義。
var a = function() {
alert('foo')
}()
的jsfiddle網址爲上面的代碼:http://jsfiddle.net/qLKsq/
爲什麼沒有額外的對周圍的函數定義括號此代碼的工作?
這是聲明和表達式之間的區別,如果編譯器已經處於表達式模式,您不需要告訴它切換。 –
JS對函數聲明和表達式使用幾乎相同的語法。你的第一個是(或者將是)一個聲明,但是它缺少了這個名字。其他人是表達的一部分,所以他們可以是匿名的。 –
[ECMAScript 12.4](http://www.ecma-international.org/ecma-262/5.1/#sec-12.4):「[A] n * ExpressionStatement *不能以'function'關鍵字開頭,因爲這可能會導致它與* FunctionDeclaration *不明確。「所有的聲明類型都列在[第12節](http://www.ecma-international.org/ecma-262/5.1/#sec-12); ExpressionStatement是一個表達式的語句。使用左括號明確開始表達式。在其他情況下,ECMAScript語法需要表達式,所以不需要消歧。 – apsillers