首页 > temp > JavaScript教程 >
-
浅谈JavaScript eval() 函数
用js的人都应该知道eval()函数吧,虽然该函数用的极少,但它却功能强大,那么问题来了,为什么不常用呢?原因很简单,因为eval()函数是动态的执行其中的字符串,里面有可能是脚本,那么这样的话就有可能引发系统的安全问题,所以能不用就不用,但至少也要知道它的用法。
eval()函数的作用简单来说就是用来把括号中的字符串当作代码来执行,举个简单的例子,eval("2+3") ,返回的就是5。需要注意的是该方法就受的只能是原始的字符串参数,如果不是的话它将什么都不会做原样返回,所以你给它传个对象什么的都是没有用的。
接下来举两个例子来看一下:
1
2
3
4
5
6
7
8
9
10
|
<script type= "text/javascript" > eval( "x=10;y=20;document.write(x*y)" ) document.write(eval( "2+2" )) var x=10 document.write(eval(x+17)) </script> |
这段代码执行后会输出:
200
4
27
看起来好像很简单的样子,但仅仅是这样貌似它没有什么用处,好像就是用来搞笑的,那么一般常用它干什么呢?诶,如果你知道json的话肯定就知道它可以用来把json由字符串格式转换成json对象,在异步请求中,如果服务器返回的是json字符串格式的话,你没有办法直接用,所以要先把它转化成json对象格式,这样再结合for in循环的话就可以去遍历它,提取你需要的信息,那么到底怎么用呢,来看个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
var data= " { root: [ {name:'1',value:'0'}, {name:'6101',value:'北京市'}, {name:'6102',value:'天津市'}, {name:'6103',value:'上海市'}, {name:'6104',value:'重庆市'}, {name:'6105',value:'渭南市'}, {name:'6106',value:'延安市'}, {name:'6107',value:'汉中市'}, {name:'6108',value:'榆林市'}, {name:'6109',value:'安康市'}, {name:'6110',value:'商洛市'} ] }" ; |
比如这就是服务器返回后来的json字符串,那么怎么处理呢,很简单:
var dataObj=eval("("+data+")");
这样就ok了,是不是很简单,什么?你问为什么要加括号,这也很简单,因为如果不加括号的话,eval函数会把json中大括号中的当成语句块来处理,那它就变了,你也知道,比如你的女朋友或男朋友变了,你是会难过的,所以要采取办法阻止它,就是加个括号,强制的把它转换成对象来处理,避免当成语句块来执行,比如:
1
2
|
alert(eval( "{}" ); // return undefined alert(eval( "({})" ); // return object[Object] |
虽然如此,但是前面说了,某样东西如果过于强大的话它就会有危险,所以还是不用好,那么怎么解决处理json字符串的问题呢,这肯定不是问题,有两种方法:
一是使用Function对象来完成,它的典型应用就是在JQUERY中的AJAX方法下的success等对于返回数据data的解析 :
1
2
|
var json= '{"name":"CJ","age":18}' ; data =( new Function( "" , "return " +json))(); |
这时data就是一个json对象了。
另一种方法就是用库来解决,常用的就是jquery,jquery中封装了很完善的Ajax方法,只要把返回的格式设置正确,就不用自己来转换了,如:
1
2
3
4
5
6
7
8
9
|
$.getJSON( "http://..../" ,{param: "gaoyusi" }, function (data){ //此处返回的data已经是json对象 $.each(data.root, function (idx,item){ if (idx==0){ return true ; //同countinue,返回false同break } alert( "name:" +item.name+ ",value:" +item.value); }); }); |
是不是感觉有了库世界都变得美好了,但是万变不离其宗,再怎么样也要先把原生的东西学好,这样用起库来就游刃有余了,好吧,eval函数就说这么多,当然要说一下,以上例子皆是参考网上资源的,如有看过,就权当再看一遍。
来源:https://www.cnblogs.com/wanglinmantan/p/5410625.html