概述
eval函数解析
定义及用法
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
语法
eval(string)
参数
string 必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。
返回值
通过计算 string 得到的值(如果有的话)。
说明
该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。因此请不要为 eval() 函数传递 String 对象来作为参数。
如果试图覆盖 eval 属性或把 eval() 方法赋予另一个属性,并通过该属性调用它,则 ECMAScript 实现允许抛出一个 EvalError 异常。
抛出
如果参数中没有合法的表达式和语句,则抛出 SyntaxError 异常。
如果非法调用 eval(),则抛出 EvalError 异常。
如果传递给 eval() 的 Javascript 代码生成了一个异常,eval() 将把该异常传递给调用者。
为什么不要使用eval
eval翻译:是evaluate,评估,评价的意思。
eval的重点在于eval函数名赋值给变量之后,它的作用域可能发生的变化。参考代码段3
w3school中eval的定义:eval(string) 函数可计算所传字符串string,并执行其中的的 JavaScript 代码,代码是可执行语句或者字符串都会被执行。
eval('window.console.log("LBJ")');//LBJ
eval(window.console.log("LBJ"));//LBJ
window.console.log("LBJ");//LBJ
//三条语句输出的结果是一样的
下面参考其他博客的总结:
在看别的大牛的博客时,总会提示不要使用eval,一直没有深入研究为什么,总以为是安全性问题,也没有去研究eval的其他的注意事项,最近在看“JavaScript秘密花园”博客时,碰到这个问题,参考并做了一些总结。
首先,eval函数的作用是在当前作用域中执行一段JavaScript代码字符串。
如下代码段1:
//代码段1
var foo = 1;
function test() {
var foo = 2;
eval('foo = 3');
return foo;
}
test(); // 3
foo; // 1
函数test里面调用eval执行foo=3,修改了test()函数的变量foo,并不会改变全局foo的值。
但是 eval 只在被直接调用并且调用函数就是 eval 本身时,才在当前作用域中执行,如何理解这句话呢?
以下代码段2就不属于对于eval的直接调用了
代码段2如下:
//代码段2
var foo = 1;
function test() {
var foo = 2;
var bar = eval; //这里将bar变量指向了eval函数的引用
bar('foo = 3');
return foo;
}
test(); // 2
foo; // 3
上面的代码等价于在全局作用域中调用 eval,和下面两种写法(代码段3)效果一样:
代码段3:
//代码段3
// 写法一:直接调用全局作用域下的 foo 变量
var foo = 1;
function test() {
var foo = 2;
window.foo = 3;
return foo;
}
test(); // 2
foo; // 3
// 写法二:使用 call 函数修改 eval 执行的上下文为全局window作用域
var foo = 1;
function test() {
var foo = 2;
eval.call(window, 'foo = 3');
return foo;
}
test(); // 2
foo; // 3
在任何情况下我们都应该避免使用 eval 函数。99.9% 使用 eval 的场景都有不使用 eval 的解决方案。
安全问题
eval 也存在安全问题,因为它会执行任意传给它的代码, 在代码字符串未知或者是来自一个不信任的源时,绝对不要使用 eval 函数。
结论
绝对不要使用 eval,任何使用它的代码都会在它的工作方式,性能和安全性方面受到质疑。 如果一些情况必须使用到 eval 才能正常工作,首先它的设计会受到质疑,这不应该是首选的解决方案, 一个更好的不使用 eval 的解决方案应该得到充分考虑并优先采用。只要知道写 JavaScript 代码当使用 eval 时,存在这个问题就行,毕竟现在直接用 JavaScript 库比较多,安全性能好很多。
最后
以上就是心灵美大碗为你收集整理的eval函数eval函数解析为什么不要使用eval的全部内容,希望文章能够帮你解决eval函数eval函数解析为什么不要使用eval所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复