eval()

只用于反序列化。(反序列化的意思是从字节流中重构对象,这里指的应该是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.