JavaScript是一门Web编程语言,用来实现网页的交互功能,它和HTML、CSS共同组成了个Web开发的基础工具集合,也是前端开发者必备的技能;学习JavaScript教程可以了解它在网页开发中的所有特性和相关概念,让我们能够更加快速的去开发Web应用。
这个eval该函数用于执行JavaScript源代码。
语法说明
eval(expr)
执行一下代码说明
expr:
expr 是一个表示 JavaScript 表达式、语句或语句序列的字符串。该表达式可包含现有对象的变量和属性。我们不应调用 eval 来求值算术表达式(如 5 * 9 + 5 - 4),因为 JavaScript 会自动计算算术表达式。需注意参数 expr 是可选的。若未提供参数,eval 将返回 "undefined"。
不要使用eval()
eval()存在执行效率低下且易引发安全隐患的问题,因此不建议使用。主要原因如下:
i) 任意代码执行带来安全风险:传递给 eval 的代码将以调用者的权限执行。因此,若传递的代码可能受到恶意篡改,将导致以您网站的权限在用户设备上运行恶意代码。
ii) 破坏词法作用域引发预期外行为:恶意代码能够获取传递给eval的代码被调用时所处的作用域,从而可能引发安全威胁。
iii) 运行时解释导致性能损耗:eval需调用JS解释器,导致执行缓慢。
其他问题:调试难度增加、阻碍JavaScript引擎优化机制、易引发XSS攻击等安全漏洞、作用域污染导致变量冲突等
eval()函数示例-1
以下示例演示了如何使用eval()函数。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>JavaScript: eval function example-1</title>
</head>
<body>
<h1 style="color: red">JavaScript eval() function example-1</h1>
<hr />
<script type="text/javascript">
//This is done to make the following JavaScript code compatible to XHTML. <![CDATA[
eval("language = 78; math = 89; science=90; document.write('Total marks : '+(language + math + science));");
//]]>
</script>
</body>
</html>
执行一下eval()函数示例-2
这是另一个 eval() 函数的使用示例。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>JavaScript: eval function example-2</title>
</head>
<body>
<h1 style="color: red">JavaScript eval() function example-2</h1>
<hr />
<script type="text/javascript">
//This is done to make the following JavaScript code compatible to XHTML. <![CDATA[
var x = "alert ('We are learning JavaScript eval() function.')";
eval (x);
//]]>
</script>
</body>
</html>
执行一下eval 替代方案
应使用成员运算符而非通过eval转换属性名获取属性。
不推荐的代码:
var lettername = getPropName(); //returns "a" or "b"
eval("var display = letters." + propname );
推荐代码:
var lettername = getPropName(); //returns "a" or "b"
var display= letters[ propname ]; // letters[ "a" ] is the same as letters.a
使用函数而非执行代码片段
使用JSON.stringify和JSON.parse代替eval方法
传递数据而非代码
从网页抓取数据时,使用XPATH而非JavaScript代码。
维护跨实现兼容性
不要使用 eval 函数的第二个参数。该参数并非在所有现代浏览器中都受支持。
以受限权限执行代码
若确实需使用eval执行代码,则应降低权限。不过,这(降低权限)可能未在诸多应用中实现。某些用例可能会在XUL(一种Mozilla前端架构)中实现此机制。