为什么不要使用 eval
来源:互联网 发布:下载软件游戏 编辑:程序博客网 时间:2024/04/27 23:00
eval 函数会在当前作用域中执行一段 JavaScript 代码字符串。
var foo = 1;function test() { var foo = 2; eval('foo = 3'); return foo;}test(); // 3foo; // 1
但是 eval 只在被直接调用并且调用函数就是 eval 本身时,才在当前作用域中执行。
var foo = 1;function test() { var foo = 2; var bar = eval; bar('foo = 3'); return foo;}test(); // 2foo; // 3
译者注:上面的代码等价于在全局作用域中调用 eval,和下面两种写法效果一样:
// 写法一:直接调用全局作用域下的 foo 变量var foo = 1;function test() { var foo = 2; window.foo = 3; return foo;}test(); // 2foo; // 3
// 写法二:使用 call 函数修改 eval 执行的上下文为全局作用域var foo = 1;function test() { var foo = 2; eval.call(window, 'foo = 3'); return foo;}test(); // 2foo; // 3
在任何情况下我们都应该避免使用 eval 函数。99.9% 使用 eval 的场景都有不使用 eval 的解决方案。
伪装的 eval
定时函数 setTimeout 和 setInterval 都可以接受字符串作为它们的第一个参数。 这个字符串总是在全局作用域中执行,因此 eval 在这种情况下没有被直接调用。
安全问题
eval 也存在安全问题,因为它会执行任意传给它的代码, 在代码字符串未知或者是来自一个不信任的源时,绝对不要使用 eval 函数。
结论
绝对不要使用 eval,任何使用它的代码都会在它的工作方式,性能和安全性方面受到质疑。 如果一些情况必须使用到 eval 才能正常工作,首先它的设计会受到质疑,这不应该是首选的解决方案, 一个更好的不使用 eval 的解决方案应该得到充分考虑并优先采用。
0 0
- 为什么不要使用 eval
- 为什么不要使用 eval
- 为什么不要用eval函数
- 为什么不要使用Response.Close()
- 为什么不要工程中不要随意使用define定义常量
- 为什么尽量不要使用CSS Expression
- 为什么不要行内使用javascript
- 为什么尽量不要使用using namespace std?
- 为什么尽量不要使用using namespace std?
- 关于 Ajax中返回json类型数据为什么使用? eval()
- 使用eval转换json对象时为什么外边加括号?
- 使用eval转换json对象时为什么外边还要加括号eval("("+data+")");
- eval使用
- eval使用
- 为什么我们不要使用nolock in SQL Server
- 为什么你应该永远不要再使用MongoDB
- 为什么不要使用 ::before{content:url('xxx')} 设置图标
- 为什么使用eval()将json字符串转换为对象要多加一个小括号
- leetcode 223: Rectangle Area
- 黑马程序员_IO流
- 不支持union select 时的asp手工注入方法
- 单一职责原则
- 图像格式转换——合理使用工具的重要性以及常用图像转换工具分析
- 为什么不要使用 eval
- undefined 和 null
- GetHashCode()用来干啥?
- 在应用非正常退出时利用StateSaver来保存我们的数据
- Python批量重命名指定文件夹下文件的两种方法
- 第一题 P066
- 黑马程序员——java基础—-反射
- CSS 中一些常见到的BUG及解决办法整理【转】
- CSS 常用到的一些技巧【转】