2012-10-10 139 views
3

爲什麼這個返回語法錯誤:功能包裹在括號

function(foo){console.log(foo)} 

我期望這個返回函數的值,因此返回其自身,而不是將其分配到任何東西,但我得到一個「語法錯誤:意外的令牌(」

但這個工程:

(function(foo){console.log(foo)}) 

請解釋一下這些包裝括號起什麼作用我已經告訴括號是用來「增加可讀性」,但在T他的情況肯定有更多的目的。

你可以請進入有關使用about()的更多細節嗎?假設你將這段代碼翻譯成散文,那麼()讀起來會怎樣?我也在向其他人描述這個概念,並且需要傳遞它的含義,以便每個人都能理解它。我試圖回答的問題是()的含義是什麼?他們有語義價值嗎?它是什麼?

+0

在第一個例子中缺少一個標識符。在第二個例子中,當你用parens包裹時,你正在創建一個表達式函數 – fcalderan

回答

6

你的第一個例子是一個功能聲明 。它沒有標識符,這是一個語法錯誤。這裏的grammar for a function declaration(注意:標識符是不可選):

FunctionDeclaration :

functionIdentifier(FormalParameterListopt) {FunctionBody}

的括號包裹它,你把它變成一個功能表達(匿名的)。您可以通過後添加一對調用括號的執行:

(function(foo){console.log(foo)})("hello"); //Will log 'hello' 

下面是一個函數表達式的gammar(即現在的標識是可選的):

FunctionExpression :

functionIdentifieropt(FormalParameterListopt) {FunctionBody}


括號如何轉將函數聲明轉換爲函數表達式

在這種情況下,括號被解析爲「grouping operator「。對於分組運算符的語法如下:

PrimaryExpression :

(Expression)

分組操作只能包含一個表達式,所以你的函數解析爲一個表達式,而不是一個聲明(很明顯,在你的確切例如,函數可以」由於它沒有標識符,所以是一個聲明)。

+0

謝謝詹姆斯!但是我仍然錯過了關於()的部分。他們似乎擁有神奇的力量,能夠改變行動的優先級(1 + 1)* 2並能夠將聲明改爲表達。我如何區分這兩種情況?有沒有放棄特徵,或者這是如何工作的? – DLeonardi

+0

@ user436118 - 不客氣:)查看我的編輯,我添加了一些關於括號如何將聲明轉換爲表達式的內容。 –

+0

+1美麗的解釋 – techfoobar

2

這是因爲如果沒有(),所述function(){}線是function declaration,而()expression

函數聲明是一個奇怪的野獸,他們取得了他們在執行代碼所限定的範圍隨處可見,所以像這樣的片斷工作:

foo(); 
function foo() { console.log('foo'); } 
+0

檢查標題標題爲「關於圍繞圓括號的問題」的部分 http://dmitrysoshnikov.com/ecmascript/chapter-5-functions/#question-約括號括號] – complex857