我无法理解这个JavaScript语句中的括号

时间:2011-02-16 09:01:32

标签: javascript parentheses

我无法理解下面JavaScript语句中的括号:

({go_go: 'go'});

这里的()是什么意思?

我知道函数中的()意味着此函数是匿名的。就像下面的代码一样。是不是?

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

谢谢!

3 个答案:

答案 0 :(得分: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。)

答案 1 :(得分:1)

我认为Why does JavaScript's eval need parentheses to eval JSON data?会回答你的问题。

如果您的代码中只有一个普通的对象文字,则不需要它们。

在函数表达式中,外部()不会使函数匿名(它已经没有名称)。但是,要在定义后立即执行匿名函数,它们是必需的,因为function(){}();无效。

答案 2 :(得分:0)

有些人习惯用括号来包围JSON对象......

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

相同
var jsonObject = {go_go: 'go'};

他们这样做的原因是因为如果您通过AJAX调用检索JSON对象,通常需要使用括号来防止常见的解析错误。

以下代码行通常会导致无效的标签错误:

var jsonObject =  eval(stringOfJson);

这通常解决如下:

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

最后,在括号中包含立即函数的做法应该如下所示......

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

使用括号的唯一原因是它使直接功能更加明显(正如www.jslint.com等推荐的那样!)