我已经知道(艰难的)我需要在 JSON 数据周围添加括号,如下所示:
stuff = eval('(' + data_from_the_wire + ')');
// where data_from_the_wire was, for example {"text": "hello"}
(至少在 Firefox 3 中)。
这背后的原因是什么?我讨厌在不了解幕后情况的情况下编写代码。
我已经知道(艰难的)我需要在 JSON 数据周围添加括号,如下所示:
stuff = eval('(' + data_from_the_wire + ')');
// where data_from_the_wire was, for example {"text": "hello"}
(至少在 Firefox 3 中)。
这背后的原因是什么?我讨厌在不了解幕后情况的情况下编写代码。
eval
接受一系列 Javascript 语句。Javascript 解析器将出现在语句中的 '{' 标记解释为块的开始,而不是对象文字的开始。
当您将文字括在这样的括号中时:({ data_from_the_wire })
您正在将 Javascript 解析器切换到表达式解析模式。表达式中的标记 '{' 表示对象字面量声明的开始而不是块,因此 Javascript 接受它作为对象字面量。
将括号括起来data_from_the_wire
实际上等效于
stuff = eval('return ' + data_from_the_wire + ';');
如果您要在没有括号的情况下进行 eval,则将评估代码,如果您确实在其中包含任何命名函数,则将定义这些函数,但不会返回这些函数。
以在函数创建时调用函数的能力为例:
(function() { alert('whoot'); })()
会调用刚刚定义的函数。但是,以下方法不起作用:
function() { alert('whoot'); }()
所以我们看到括号有效地将 then 代码变成了一个返回的表达式,而不仅仅是要运行的代码。
在 JavaScript 中,大括号用于创建块语句:
{
var foo = "bar";
var blah = "baz";
doSomething();
}
上面的eval
几行可以放在一个字符串中并毫无问题地使用。现在考虑这个:
{
"foo": "bar",
"blah": "baz"
}
大括号导致 JavaScript 引擎认为它是一个组表达式,因此:
字符周围的语法错误。引自MDN...JavaScript 指南...对象文字:
不应在语句的开头使用对象字面量。这将导致错误或行为不符合您的预期,因为 { 将被解释为块的开头。
将对象文字包装在内部的解决方法是()
告诉引擎将其内容视为表达式,而不是块语句。所以这不起作用:
({
var foo = "bar";
var blah = "baz";
doSomething(evil);
})
// parse error
但这确实:
({
"foo": "bar",
"blah": "baz"
})
// returns object
发生这种情况是因为没有圆括号 JavaScript 试图将其解释{"text": ...
为标签并失败。在控制台中尝试,您将收到“无效标签”错误。