2011-02-16 22 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!)