eval函数会评估一个给定的含有JavaScript代码的字符串,并且试图去实行包含在字符串里的表达式或者一系列的合法的JavaScript语句。eval函数将把末了一个表达式或者语句所包含的值或引用作为返回值。
举例解释
var bar = 'bar';

var foobar = eval('"foo" + bar');
alert(foobar);
eval评估JavaScript语句var bar = 'bar';
// if variable bar equals 'bar', foobar is the result of // last executing statement: bar="foo-bar";
var foobar = eval('if(bar == "bar") {bar="foo-bar";} else {bar = "bar-foo";}');
alert(foobar);// change the valuebar = 'foo';
// now our the last executed statement is: bar = "bar-foo";
// therefore the value of variable foobar has been changed
// into 'bar-foo'foobar = eval('if(bar == "bar") {bar="foo-bar";} else {bar = "bar-foo";}');
alert(foobar);
JSON的格式
JSON的格式是由大括号和由冒号(:)构成的名值对所组成的。把稳JSON格式与工具字面量 (object literals) 的差异:JSON的名字部分严格用引号+名字来表示。
举例解释
工具的字面量var objectLiteral = { name: "Objector.L", age: "24", special: "JavaScript", sayName: function() { return this.name; }
};
JSON工具var jsonFormat = { "summary": "Blogs", "blogrolls": [ { "title": "Explore JavaScript", "link": "http://example.com/" }, { "title": "Explore JavaScript", "link": "http://example.com/" } ]
};
eval和JSON
由于Ajax的兴起,JSON这种轻量级的数据格式作为客户端与做事器之间的传输格式逐渐地盛行起来,进而涌现的问题是如何将做事器端构建好的JSON数据转化为可用的JavaScript工具。利用eval函数无疑是一种大略而直接的方法。在转化的时候须要将JSON字符串的表面包装一层圆括号:
var jsonObject = eval("(" + jsonFormat + ")");
为什么要加括号?
加上圆括号的目的是迫使eval函数在评估JavaScript代码的时候逼迫将括号内的表达式(expression)转化为工具,而不是作为语句(statement)来实行。举一个例子,例如工具字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是实行了一句空语句。以是下面两个实行结果是不同的:
alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]
JSON格式的名字部分为什么要加引号?
由于eval函数会将{foo:”bar”}阐明成合法的JavaScript语句,而非表达式。但是人们每每想要的是让eval将这段代码阐明成一个工具。以是JSON格式会逼迫你去在名字的外侧加上引号再结合圆括号,这样eval就不会缺点的将JSON阐明成代码块。
举例解释
eval缺点解析语义alert(eval('{foo:"bar"}')); // return "bar", incorrect
eval精确解析JSONalert(eval('({"foo": "bar"})')); // return JSON object, correct
结论
理解eval的事情事理和json的严格的限定格式,合理结合eval和json运用于JavaScript的数据通报和工具转换。
following this format:
eval('{' + jsonString + ')');