2013-07-16 74 views
1

由於語法錯誤,以下代碼不起作用。在某些情況下,爲什麼我們不需要在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/

爲什麼沒有額外的對周圍的函數定義括號此代碼的工作?

+0

這是聲明和表達式之間的區別,如果編譯器已經處於表達式模式,您不需要告訴它切換。 –

+0

JS對函數聲明和表達式使用幾乎相同的語法。你的第一個是(或者將是)一個聲明,但是它缺少了這個名字。其他人是表達的一部分,所以他們可以是匿名的。 –

+2

[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

回答

3

有兩種方法可以在JavaScript中定義一個函數。

A 聲明(在編譯時評估)和表達式(在運行時評估)。

您可以立即涉及一個表達式,但不能聲明。

緊接的前面的內容確定function是一個表達式還是一個聲明。

(使其成爲表達式。 =使它成爲一個表達。 「沒有」將其作爲聲明。

+0

使用'Function'構造函數可能被認爲是第三個,但我想它最終是表達式的一部分。 –

2

}()只有在函數被強制爲表達式時纔有效。你通常會看到(function(){...})()來達到這個目的,儘管penny-pinchers可能使用!function(){...}()來保存一個字節(以犧牲一個操作爲代價)。同樣,var a = ...將操作數作爲表達式,因此}()可以工作。

相關問題