只用于反序列化。(反序列化的意思是从字节流中重构对象,这里指的应该是JSON字符串重构成对象,或是执行服务器返回的JS语句)
eval() 很不稳定,会造成语义混乱,如果代码里还包含用户输入的话就更危险了,因为你无法确切得知用户会输入什么!需要使用更好更清晰更安全的方式。
然而 eval 很容易解析被序列化的对象,所以反序列化的任务还是可以交给它做的。(例如:解析RPC响应的时候)
反序列化的过程就是将字节流转换成内存中的数据结构。例如,你可能会将对象输出到文件中:
users = [
{
name: 'Eric',
id: 37824,
email: 'jellyvore@myway.com'
},
{
name: 'xtof',
id: 31337,
email: 'b4d455h4x0r@google.com'
},
...
];
用 eval 可以很简单的读取这些数据到内存中。
同样,用 eval() 可以简单的解码RPC返回值。例如,你用 XMLHttpRequest 发出一个RPC请求,服务器端相应返回JavaScript代码:
var userOnline = false;
var user = 'nusrat';
var xmlhttp = new XMLHttpRequest();
xmlhttp.open('GET', 'http://chat.google.com/isUserOnline?user=' + user, false);
xmlhttp.send('');
// Server returns:
// userOnline = true;
if (xmlhttp.status == 200) {
eval(xmlhttp.responseText);
}
// userOnline is now true.