我无法理解下面 JavaScript 语句中的括号:
({go_go: 'go'});
这里是什么()
意思?
我知道()
函数意味着这个函数是匿名的。就像下面的代码一样。这样对吗?
(function () {
alert('something');
})();
谢谢!
我无法理解下面 JavaScript 语句中的括号:
({go_go: 'go'});
这里是什么()
意思?
我知道()
函数意味着这个函数是匿名的。就像下面的代码一样。这样对吗?
(function () {
alert('something');
})();
谢谢!
在那个文字示例中,它们没有任何用途,但通常它们用于封闭表达式 - 具体而言,用于确保将括号的内容作为表达式读取,而不是作为语句读取。
当人们使用eval
JSON 格式反序列化数据时,您会看到类似的情况。例如,他们可能会收到以下形式的字符串:
var s = '{"go_go": "go"}';
...并使用它来反序列化它:
var o = eval('(' + s + ')');
对于某些问题,这是一种旧的解决方法,但最好使用适当的 JSON 解析库,例如Crockford 的 github 页面上列出的三个中的任何一个。(Crockford 是 JSON 的发明者。)其中有一个执行一些正则表达式来检测各种格式错误的 JSON 内容,然后使用eval
,还有两个根本不使用eval
。eval
(在处理来自不受信任来源的 JSON 时,我永远不会使用。)
我想为什么 JavaScript 的 eval 需要括号来评估 JSON 数据?回答你的问题。
但是,如果您的代码中只有一个普通的对象文字,则不需要它们。
在您的函数表达式中,外部()
不要使函数匿名(它已经是因为它没有名称)。但是,要在定义匿名函数后立即执行它,它们是必要的,因为它们function(){}();
是无效的。
有些人习惯用括号括起来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 等所推荐的那样!)