JavaScript 为什么不推荐使用 eval

 我来答
xiangjuan314
2016-04-15 · TA获得超过3.3万个赞
知道大有可为答主
回答量:2.9万
采纳率:0%
帮助的人:2877万
展开全部
破坏代码可阅读性

eval(string)

参数
描述

string 必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。
简单点就是说eval方法接收任何字符串,然后会编译和运行字符串,把它当成js代码来执行,到这里,我就发现一点不好的地方了。
如果我们要执行一段代码,一行一样写下来多好,为什么要把这些代码放到eval方法里来执行呢?
这无疑会破话代码的可阅读行,还有增加调试的难度。
eval伪装
有如下代码:

var foo = 1;
function test() {
var foo = 2;
eval('foo = 3');
return foo;
}
test(); // 3
foo; // 1

但是只有当eval被直接调用时才会按预期执行,否则eval将在全局作用域下执行。
var foo = 1;
function test() {
var foo = 2;
var bar = eval;
bar('foo = 3');
return foo;
}
test(); // 2
foo; // 3

所以,当对eval使用的位置不恰当是,会得到不同的结果,这样既混淆了结果,也不利于程序的执行,例如js的settimeout函数的第一个参数也接收字符串形式的方法,但是必须为全局定义的函数,内部定义的则不起作用。
function a(){
console.log(1);
}
function b(){
var a = function(){
console.log(3);
}
setTimeout('a();',1000);
}
b();//1

执行b方法打印出1而不是3则充分证明这一点。
安全性太差
由于eval方法接收任何字符串形式的参数,那么就会对安全性进行破坏,例如下面这段代码:
var c = $('input').val();
var obj = eval('({username:'+c+'})');

如果我在文本框输入alert(1)会得到什么结果呢?,可想而知,跟sql植入一个道理会破话安全性。
和JSON.parse比较
单纯比较:
var json_str = "{\"username\":\"dd\"}";
JSON.parse(json_str);//Object {username: "dd"}
eval('('+json_str+')'); //Object {username: "dd"}

看起来很正常,但是如果这样:

var json_str = "{\"username\":1+1}"
JSON.parse(json_str);//SyntaxError: Unexpected token +
eval('('+json_str+')');//Object {username: 2}

可以看出json.parse会首先检查语法是否正确,而eval则不会检查,无条件执行,这样话还是用json.parse好一些。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式