2011-02-16 98 views
1

我無法理解的括號在下面的JavaScript語句:我無法理解這個JavaScript語句括號

({go_go: 'go'}); 

什麼是()這裏是什麼意思?

我知道()在函數中表示這個函數是匿名的。就像下面的代碼一樣。這樣對嗎?

(function() { 
    alert('something'); 
})(); 

謝謝!

回答

2

在該文字示例中,它們沒有任何用途,但通常它們用於封閉表達式  —,以確保將parens的內容讀作表達式而不是語句。

當人們使用eval以JSON格式反序列化數據時,您會看到類似的情況。因此,舉例來說,他們可能會在形式得到的字符串:

var s = '{"go_go": "go"}'; 

...並用它來反序列化:

var o = eval('(' + s + ')'); 

這是一個古老的變通一定的問題,但你'很多最好使用適當的JSON解析庫,例如Crockford's github page上列出的三個中的任何一個。 (Crockford是JSON的發明者。)有一個用來檢測各種格式不正確的JSON內容的正則表達式,然後使用eval以及另外兩個根本不使用eval的正則表達式。 (在處理來自不可信源的JSON時,我絕不會使用eval)。

+0

謝謝您的回覆!你的評論是有幫助的。我還檢查了表達式語句的語法圖。現在我已經得到了答案。 =) – weilou 2011-02-18 06:55:55

1

我認爲Why does JavaScript's eval need parentheses to eval JSON data?可以解答您的問題。

你不需要它們,如果你只是在你的代碼中有一個普通的對象字面值。

在函數表達式中,外部()不會使函數匿名(它已經是因爲它沒有名字)。但是,在定義它之後立即執行匿名函數,因爲function(){}();無效,所以它們是必需的。

0

一些人在周圍有括號JSON對象的習慣...

var jsonObject = ({go_go: 'go'}); 

相同

var jsonObject = {go_go: 'go'}; 

他們這樣做的原因,這是因爲,如果您檢索JSON對象通過AJAX調用,您通常需要使用括號來防止出現常見的解析錯誤。

下面的代碼行往往會導致一個無效的標籤錯誤:

var jsonObject = eval(stringOfJson); 

這通常是解決如下:

var jsonObject = eval("(" + stringOfJson + ")"); 

最後,包裹在括號內的即時功能的做法應該看起來像這樣...

(function() { 
    alert('something'); 
}()); 

並使用括號的唯一原因是,它使眼前的功能更明顯(如www.jslint.com除其他recommened!)