Javascript中eval方法的应用及其问题。
2014-03-20 16:11
387 查看
认识eval()方法
eval()是js Functions里面的一个方法。和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值。JavaScript通过全局函数eval()来完成这个工作。eval()可以计算某个字符串,并执行其中的javascript代码。
eval()的用法
eval()方法只有一个参数,而且它只接受字符串作为这个参数,如果这个参数不是字符串,那么它将直接返回这个函数。如果该参数是一个函数,它会把字符串当成JavaScript代码进行编译,如果编译失败则抛出一个语法错误异常。如果编译成功,则开始执行这一段代码,并返回字符串中的最后一个表达式会或语句的值,如果最后一个表达式或语句没有值,则最终返回undefined。如果字符串抛出一个异常,这个异常将把该调用传递给eval()。
这么讲可能有些费解,这里举几个例子:
<script type="text/javascript">
eval("x=10;y=20;document.write(x*y)");//输出200
document.write(eval("2+2")); //输出4
var x=10
document.write(eval(x+17)); //输出27
</script>
var operator = "+";
var num1 = 12;
var num2 = 12;
window.alert(eval(num1+eval("operator")+num2))://输出24
解释一下这段程序:里面的eval执行后是“+”,然后num1+num2作为字符串传给外层eval,结果为24.
说明:
动态判断源代码中的字符串是一种很强大的语言特性,几乎没有必要在实际中应用。如果你使用了eval(),你应当仔细考虑是否真的需要使用它。你完全可以用其他方法实现这些功能。
作为参数的字符串必须是能够单独作为语句在程序里成功执行的,否则作为参数毫无意义。而且还会抛出异常。也就是说,如果字符串作为一个单独的脚本是有语义的,那么将其传递给eval作参数是完全没有问题的,否则,eval会抛出语法错误异常。
eval()的问题
eval方法是在运行时对脚本进行解释执行,而普通的javascript会有一个预处理的过程。所以会有一些性能上的损失。但是这个倒是次要的。
eval()具有更改布局变量的能力,这对于JavaScript优化器来说是一个很大的问题。
具体说来是这样:
当脚本定义了eval的一个别名,且用另一个名称调用它,JavaScript解释器又会如何工作呢?为了让JavaScript解释器的实现更加简化,ECMAScript3标准规定了任何解释器都不允许对eval赋予别名。如果eval函数通过别名调用的话,则会抛出一个EavlError异常。实际上,大多数的实现并不是这么做的。当通过别名调用时,eval会将其字符串当成顶层的全局代码来执行。执行的代码可能会定义新的全局变量和全局函数,或者给全局变量赋值,但却不能使用或者修改主调函数中的局部变量,因此,这不会影响到函数内的代码优化。
几点建议
eval并不常用,一般能用别的方法实现,可不选择这种方法。
当给eval传参数的时候,首次按确定这个参数是字符串;其次,确定该字符串代表的语句单独执行时是有意义的。
不能将eval赋值给其他变量使用,即,不能用别的变量名称来引用eval;在这,自己的变量名称一定注意不要跟eval重复。
eval()是js Functions里面的一个方法。和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值。JavaScript通过全局函数eval()来完成这个工作。eval()可以计算某个字符串,并执行其中的javascript代码。
eval()的用法
eval()方法只有一个参数,而且它只接受字符串作为这个参数,如果这个参数不是字符串,那么它将直接返回这个函数。如果该参数是一个函数,它会把字符串当成JavaScript代码进行编译,如果编译失败则抛出一个语法错误异常。如果编译成功,则开始执行这一段代码,并返回字符串中的最后一个表达式会或语句的值,如果最后一个表达式或语句没有值,则最终返回undefined。如果字符串抛出一个异常,这个异常将把该调用传递给eval()。
这么讲可能有些费解,这里举几个例子:
<script type="text/javascript">
eval("x=10;y=20;document.write(x*y)");//输出200
document.write(eval("2+2")); //输出4
var x=10
document.write(eval(x+17)); //输出27
</script>
var operator = "+";
var num1 = 12;
var num2 = 12;
window.alert(eval(num1+eval("operator")+num2))://输出24
解释一下这段程序:里面的eval执行后是“+”,然后num1+num2作为字符串传给外层eval,结果为24.
说明:
动态判断源代码中的字符串是一种很强大的语言特性,几乎没有必要在实际中应用。如果你使用了eval(),你应当仔细考虑是否真的需要使用它。你完全可以用其他方法实现这些功能。
作为参数的字符串必须是能够单独作为语句在程序里成功执行的,否则作为参数毫无意义。而且还会抛出异常。也就是说,如果字符串作为一个单独的脚本是有语义的,那么将其传递给eval作参数是完全没有问题的,否则,eval会抛出语法错误异常。
eval()的问题
eval方法是在运行时对脚本进行解释执行,而普通的javascript会有一个预处理的过程。所以会有一些性能上的损失。但是这个倒是次要的。
eval()具有更改布局变量的能力,这对于JavaScript优化器来说是一个很大的问题。
具体说来是这样:
当脚本定义了eval的一个别名,且用另一个名称调用它,JavaScript解释器又会如何工作呢?为了让JavaScript解释器的实现更加简化,ECMAScript3标准规定了任何解释器都不允许对eval赋予别名。如果eval函数通过别名调用的话,则会抛出一个EavlError异常。实际上,大多数的实现并不是这么做的。当通过别名调用时,eval会将其字符串当成顶层的全局代码来执行。执行的代码可能会定义新的全局变量和全局函数,或者给全局变量赋值,但却不能使用或者修改主调函数中的局部变量,因此,这不会影响到函数内的代码优化。
几点建议
eval并不常用,一般能用别的方法实现,可不选择这种方法。
当给eval传参数的时候,首次按确定这个参数是字符串;其次,确定该字符串代表的语句单独执行时是有意义的。
不能将eval赋值给其他变量使用,即,不能用别的变量名称来引用eval;在这,自己的变量名称一定注意不要跟eval重复。
相关文章推荐
- JS中eval工作原理和json格式(eval+json两者结合应用)2011-07-05 22:39--本文讲解一下javascript中eval与json的应用问题。
- Web应用开发过程中常见的几个中文问题及其解决方法
- JavaScript欺骗词法的eval、with与catch及其性能问题
- Eclipse下开发QT4应用,看不见添加的控件的问题及其解决方法
- 2015年7月4日解决问题:eclipse连接access数据库问题//java五中布局及其应用方法//equals()与==的区别等
- JavaScript中的bind方法及其常见应用
- 在 Vista 中配置 Reporting Services 可能遇到的权限问题及其解决方法
- IE 6 下无法加载图片的奇怪问题及其解决方法
- javascript中apply和call方法比较及其妙用
- Java web应用中的常见字符编码问题的解决方法
- JavaScript页面刷新与弹出窗口问题解决方法
- UNIX 共享内存应用中的问题及解决方法
- Hibernate one-to-one 的N+1问题分析及其解决方法
- Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
- js中的keyCode及其应用方法举例
- 彻底解决Android 应用方法数不能超过65K的问题
- Angular C SP 抛出 eval () 问题解决方法。
- javascript预览上传图片发现的问题的解决方法
- javascript 中eval()工作原理和json格式(eval+json两者结合应用)
- [疯狂Java]泛型:泛型构造器、泛型方法的重载问题、泛型数组的问题(应该摒弃)、?下限的典型应用