博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
eval()的使用和兼容性问题
阅读量:7071 次
发布时间:2019-06-28

本文共 1039 字,大约阅读时间需要 3 分钟。

eval()的使用

eval() 函数可将字符串转换为代码执行,并返回一个或多个值

eval调用时,实例为eval( "( javascript代码 )" )

eval()的返回值

eval()的返回值遵循以下规则:

  1. 如果eval()的参数不是字符串,那么eval()将直接返回参数。
  2. 如果eval()的参数是字符串,那么eval()将这个字符串解析成代码后进行执行,并返回最后一行代码执行的结果。
  3. 如果字符串无法解析成合法的代码,eval()将抛出SyntaxError错误。

举例1(eval的参数不是字符串):

图片描述

运行结果(谷歌浏览器测试):

图片描述

举例2(eval的参数是字符串):

图片描述

运行结果(谷歌浏览器测试):

图片描述

当然,如果不使用eval()方法,上面的代码可以使用匿名函数写

图片描述

举例3(字符串无法解析成合法的代码):

图片描述

运行结果(谷歌浏览器测试):此时可以看到 谷歌浏览器控制台报错

图片描述


eval()的兼容性问题

IE6/7/8不兼容

图片描述

使用IE8来测试代码:

var str = "function(){alert('Test eval')}";var fn = eval("(" + str + ")");fn();

没有弹出框,控制台报错:

图片描述

解决方法:

a)var s = "function(){alert('Test!')}";

b)var s = "0?0:function(){alert('Test!')}";

当然这个解决方法是从国外论坛里面找到(网站:
图片描述

大意是:这在JScript解释器里面是一个bug,它不会出现在IE9除非你使用混杂模式或兼容来看。IE8错误将这个函数表达式解释为函数的声明,使得它没有任何的返回值。所以你可以写成其他比较典型的表达式,从从而在JScript解释器中构成一个表达式。

那么我们就知道IE6/7/8使用JScrip解释器来解析eval()把参数当初函数声明,没有返回值,所以我么可以把eval()函数里面的字符串代码写成一个表达式,即可以写成:

function(){alert('Test!')} 或 0?0:function(){alert('Test!')}

改代码:

var str = "0 ? 0 : function(){alert('Test eval')}";var fn = eval("(" + str + ")");fn();

在IE8里面测试结果:

图片描述

最后利用ietester工具测试在IE6也同样没有问题。

转载地址:http://lrkml.baihongyu.com/

你可能感兴趣的文章
Python中元组、列表、字典的遍历和相互转化
查看>>
SmoothWall的小企业应用
查看>>
FOSCommentBundle功能包:设置Doctrine ORM映射(投票)
查看>>
Enterprise Library Step By Step系列(十五):配置应用程序块——设计篇
查看>>
Visio中插入公式
查看>>
对于软件生产能解决到痛点的容器技术就是好!Wise2C睿云智合如何运行
查看>>
SharePoint 2013 状态机工作流之扩展自定义状态
查看>>
物联网下的工控机产业发展迅速 潜力正不断被挖掘
查看>>
云上数据安全,初识数据库审计
查看>>
法国轻奢手机品牌HANMAC 解决手机行业创新瓶颈
查看>>
用户数据是关键 欧盟或调查微软收购领英交易
查看>>
制定网络安全计划目标,比方说先……
查看>>
UOS3.0:给企业以安全感与确定性
查看>>
花了8500万美元之后,FB关闭了那个开发者平台
查看>>
与高通纠纷受关注 苹果利润或遭诺基亚侵权诉讼蚕食
查看>>
《Objective-C入门经典》——2.5节问与答
查看>>
《R语言与数据挖掘最佳实践和经典案例》—— 1.3 数据集
查看>>
《SolidWorks 2017中文版机械设计从入门到精通)》——1.10 范例
查看>>
Boost中的一些实用技术
查看>>
数据库优化和SQL操作的相关题目
查看>>