eval()
最后更新于:2022-04-01 22:24:44
## `eval()`
只用于解析序列化串 (如: 解析 RPC 响应)
`eval()` 会让程序执行的比较混乱, 当 `eval()` 里面包含用户输入的话就更加危险.
可以用其他更佳的, 更清晰, 更安全的方式写你的代码, 所以一般情况下请不要使用 eval().
当碰到一些需要解析序列化串的情况下(如, 计算 RPC 响应), 使用 `eval` 很容易实现.
解析序列化串是指将字节流转换成内存中的数据结构. 比如, 你可能会将一个对象输出成文件形式:
```
users = [
{
name: 'Eric',
id: 37824,
email: 'jellyvore@myway.com'
},
{
name: 'xtof',
id: 31337,
email: 'b4d455h4x0r@google.com'
},
...
];
```
很简单地调用 `eval` 后, 把表示成文件的数据读取回内存中.
类似的, `eval()` 对 RPC 响应值进行解码. 例如, 你在使用 `XMLHttpRequest` 发出一个 RPC 请求后, 通过 eval () 将服务端的响应文本转成 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.
```
';