浅谈JavaScript eval() 函数
用js的人都应该知道eval()函数吧,虽然该函数用的极少,但它却功能强大,那么问题来了,为什么不常用呢?原因很简单,因为eval()函数是动态的执行其中的字符串,里面有可能是脚本,那么这样的话就有可能引发系统的安全问题,所以能不用就不用,但至少也要知道它的用法。
eval()函数的作用简单来说就是用来把括号中的字符串当作代码来执行,举个简单的例子,eval("2+3") ,返回的就是5。需要注意的是该方法就受的只能是原始的字符串参数,如果不是的话它将什么都不会做原样返回,所以你给它传个对象什么的都是没有用的。
接下来举两个例子来看一下:
<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循环的话就可以去遍历它,提取你需要的信息,那么到底怎么用呢,来看个例子:
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中大括号中的当成语句块来处理,那它就变了,你也知道,比如你的女朋友或男朋友变了,你是会难过的,所以要采取办法阻止它,就是加个括号,强制的把它转换成对象来处理,避免当成语句块来执行,比如:
alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]
虽然如此,但是前面说了,某样东西如果过于强大的话它就会有危险,所以还是不用好,那么怎么解决处理json字符串的问题呢,这肯定不是问题,有两种方法:
一是使用Function对象来完成,它的典型应用就是在JQUERY中的AJAX方法下的success等对于返回数据data的解析 :
var json='{"name":"CJ","age":18}';
data =(new Function("","return "+json))();
这时data就是一个json对象了。
另一种方法就是用库来解决,常用的就是jquery,jquery中封装了很完善的Ajax方法,只要把返回的格式设置正确,就不用自己来转换了,如:
$.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函数就说这么多,当然要说一下,以上例子皆是参考网上资源的,如有看过,就权当再看一遍。
浅谈JavaScript eval() 函数的更多相关文章
- 浅谈JavaScript匿名函数与闭包
一. 匿名函数 //普通函数定义: //单独的匿名函数是无法运行的.就算运行了,也无法调用,因为没有名称. 如: function(){ alert('123'); ...
- 浅谈javascript的函数节流
什么是函数节流? 介绍前,先说下背景.在前端开发中,有时会为页面绑定resize事件,或者为一个页面元素绑定拖拽事件(其核心就是绑定mousemove),这种事件有一个特点,就是用户不必特地捣乱,他在 ...
- 浅谈JavaScript的函数表达式(闭包)
前文已经简单的介绍了函数的闭包.函数的闭包就是有权访问另一个函数作用域的函数,也就是函数内部又定义了一个函数. var Super=function(num){ var count=num; retu ...
- 浅谈JavaScript的函数的call以及apply
我爱撸码,撸码使我感到快乐!大家好,我是Counter.今天就来谈谈js函数的call以及apply,具体以代码举例来讲解吧,例如有函数: function func(a, b) { return a ...
- 浅谈JavaScript的函数表达式(递归)
递归函数,在前面的博客中已经简单的介绍了.递归函数是一个通过函数名称在函数内部调用自身的函数.如下: function fac(num){ if(num<1){ return 1; } else ...
- 浅谈javascript函数节流
浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...
- [转载]浅谈JavaScript函数重载
原文地址:浅谈JavaScript函数重载 作者:ChessZhang 上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都 ...
- 浅谈 JavaScript 编程语言的编码规范
对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
随机推荐
- Bootstrap <基础二十二>超大屏幕(Jumbotron)
Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...
- 1、WIN2D学习记录(win2d实现JS雨天效果)
一.Win2D Win2D是微软开源的项目 它的github地址是 https://github.com/Microsoft/Win2D 里面有详细的文档 http://microsoft.githu ...
- Android 设置ListView当前显示的item
项目中可能会有这种需求:动态设置ListView显示的item 这种需求可能会出现在不同的情况下,有的是打开页面就要显示在特定的位置,也有的是浏览列表时实时更新数据并且改变了集合中数据,或者是某种条件 ...
- WordPress程序伪静态规则(Nginx/Apache)及二级目录规则
在众多CMS程序中,我们使用WORDPRESS还是比较多的,不仅仅是安全度较好,二来在于插件和主题很多,即便对于不会建站技术的用户也很简单的就可以搭建属于自己的网站项目.对于网站我们肯定是需要让有用户 ...
- ionic的start-y属性初始化页面
混合式开发移动app,要实现的是初始化页面时不展示搜索框,让页面向上移动一定位移. <ion-content class="has-subheader" start-y=&q ...
- 基于WWF搭建的通用审批流程
月明星稀,却不见明月:蛾儿雪柳暗香飘过,纵使回首千百回,却不知,心已灭:壮志未酬,却落得个多情应该笑我:扬帆起航,却不知,帆已破.这是我刚离职时的心情,曾几何时,真的想呆在一家公司,做一名优秀的技术管 ...
- 利用calc计算宽度
width:calc(100% - 40px)可用 + - * / 进行计算(ie9+) 注:计算符号前后必须跟上空格.
- ueditor工具栏更改按钮的默认操作
ueditor 上的 image 按钮,默认有一个图片选择工具. 但是我想把他去掉,用上自己写的图片选择功能. 原来使用cleditor 是可以给按钮自定义一个函数.但是在ueditor就没有找到可以 ...
- silverlight导出excel
开发导出excel,首先需要添加项目引用. Microsoft.CSharp 这个是应用dynamic的前提. 在代码页,需要添加引用 using System.Runtime.InteropServ ...
- TransactionScope 使用记录
最近使用TransactionScope来进行处理不同数据库的操作问题,当看到这里的时候肯都是在使用或者要使用的吧,关于他的使用网络上一大堆,我在使用的时候遇到了一下的问题,作为记录,可能会对以后使用 ...