为什么var o = {"a":"b"}; 执行并完成我的期望,而eval('{"a":"b"}')失败了?

Sam*_*lle 1 javascript

当我使用evals修复旧代码中的错误时,我意识到表达式评估真的很奇怪.

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

eval ('{"a": "b"}')
Run Code Online (Sandbox Code Playgroud)

要么

{"a": "b"}
Run Code Online (Sandbox Code Playgroud)

你得到

SyntaxError: Unexpected token :
Run Code Online (Sandbox Code Playgroud)

但如果你输入

var o = {"a": "b"};
Run Code Online (Sandbox Code Playgroud)

该语句以期望的结果执行.

如果你打字也是

(function() {return {"a": "b"};})()
Run Code Online (Sandbox Code Playgroud)

你得到:

Object {a: "b"}
Run Code Online (Sandbox Code Playgroud)

另外,如果你输入{a: "b"},你会得到"b".我根本不明白.

我习惯于认为var o = {"a": "b"};"评估表达式{"a": "b"}并将结果分配给o.

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

任何人都可以提供一个线索,说明为什么我可以返回或将某个不是有效可评估表达式的值的值分配给变量?

Bar*_*mar 5

原因是花括号在Javascript中用于两个目的:它们包围对象文字,它们也包围代码块.

控制台并将eval大括号解释为启动代码块,但您正在键入对象文字.这导致了错误.