JavaScript 为什么不推荐使用 eval
展开全部
破坏代码可阅读性
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好一些。
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好一些。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询