我无法理解下面JavaScript语句中的括号:
({go_go: 'go'});
这里的()
是什么意思?
我知道函数中的()
意味着此函数是匿名的。就像下面的代码一样。是不是?
(function () {
alert('something');
})();
谢谢!
答案 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等推荐的那样!)