1

当我使用 eval 修复旧代码中的错误时,我意识到表达式求值非常奇怪。

如果您打开 JavaScript 控制台并键入

eval ('{"a": "b"}')

或者

{"a": "b"}

你得到

SyntaxError: Unexpected token :

但是如果你输入

var o = {"a": "b"};

该语句以预期的结果执行。

如果你输入

(function() {return {"a": "b"};})()

你得到:

Object {a: "b"}

此外,如果您键入{a: "b"},您会得到“b”。我完全不明白。

我曾经认为这var o = {"a": "b"};意味着“评估表达式{"a": "b"}并将结果分配给o.

但显然它比这更复杂。我试图在语言规范中找到关于这一点的解释,但我认为我没有使用正确的措辞进行搜索。

任何人都可以提供关于为什么我可以将本身不是有效可评估表达式的值返回或分配给变量的线索吗?

4

3 回答 3

5

原因是花括号在 Javascript 中用于两个目的:它们围绕对象文字,并且它们还围绕代码块。

控制台eval将大括号解释为开始代码块,但您输入的是对象文字。这导致了错误。

于 2013-02-27T21:10:14.573 回答
2

不,写作var o = {"a":"b"}的意思是“创建一个具有一个名为的成员的对象,a其值为b,并将该对象分配为局部变量的值o”。

括号与评估表达式无关,它们在 JavaScript 中用于对象表示法:

var a = {
   foo:1,
   baz:2
}

console.log(a.foo);
console.log(a.baz);

这将输出:

1
2

JS 对象表示法。

于 2013-02-27T21:09:27.243 回答
2

你可以使用

eval('({"a":"b"})'); // mind the parens

需要它们的原因与以下答案中描述的相同:JavaScript 对象/函数/类声明周围的括号是什么意思?

尽管您可能想使用正确的 JSON 解析:JSON.parse(str).

于 2013-02-27T21:17:31.013 回答