资讯专栏INFORMATION COLUMN

eval()的使用和兼容性问题

Prasanta / 1915人阅读

摘要:的使用函数可将字符串转换为代码执行,并返回一个或多个值调用时,实例为代码的返回值的返回值遵循以下规则如果的参数不是字符串,那么将直接返回参数。错误将这个函数表达式解释为函数的声明,使得它没有任何的返回值。

eval()的使用

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

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

eval()的返回值

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

如果eval()的参数不是字符串,那么eval()将直接返回参数。

如果eval()的参数是字符串,那么eval()将这个字符串解析成代码后进行执行,并返回最后一行代码执行的结果。

如果字符串无法解析成合法的代码,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!")}";
当然这个解决方法是从国外论坛里面找到(网站:http://stackoverflow.com/ques...

大意是:这在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也同样没有问题。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80780.html

相关文章

  • 兼容系列-IE678兼容

    摘要:最简单的区分所有浏览器都会显示为紫色会显示红色会变为蓝色会变为绿色上面的样式解释为顺序是显示的结果用浏览,颜色是紫色用浏览,颜色是红色用浏览,颜色是蓝色用浏览,颜色是绿色支持伪元素伪元素和在及以下不支持兼容可以识别写法和兼容则需要引 1. 最简单的CSS Hack 区分 IE6 、 IE7 、IE8 css .color{ background-color: #CC00FF; ...

    baoxl 评论0 收藏0
  • eval到底哪里不好?

    摘要:五总结和应对方案安全性分析是否安全主要由数据源决定,如果数据源不安全,只是提供了一种攻击方法而已。方案严格管控数据源。方案低频使用时影响不大,不要高频使用,建议寻找替代方案。方案了解直接调用和间接调用的区别,遇到问题时不要懵逼即可。 为什么要少用eval? eval是 js 中一个强大的方法。都说eval == evil等于true,这篇文章将研讨eval的几个缺点和使用注意事项。 目...

    elva 评论0 收藏0
  • js字符串转化成json对象,使用JSON.parse()需要注意地方

    摘要:单引号与双引号我们看到一开始的举例中小明使用单引号来套双引号,如果反过来写呢,如小明相信也不少人习惯用双引号套单引号结果使用来转化也会报错兼容问题浏览器中不支持使用方法转成对象,所以需要引入一个文件。 相信大部分人都知道或者去百度检索都会得到将js中的字符串转化成json对象常见的3种方法 举例: var str = {name:小明,age:18}; 将字符串转化json对象: ...

    张红新 评论0 收藏0
  • 面试闯关1

    摘要:面试闯关在面试过程中,总会被问到一些你用到过但是记不清一些零碎的知识,现在做一下总结。在兼容模式中,页面以宽松的向后兼容的方式显示模拟老式浏览器的行为以防止站点无法工作。作为对象原型链的终点。格式采用键值对,例如参考面试总结 面试闯关1 在面试过程中,总会被问到一些你用到过、但是记不清一些零碎的知识,现在做一下总结。 第一部分:HTML+CSS 1.常用那几种浏览器测试?有哪些内核(L...

    malakashi 评论0 收藏0
  • 面试闯关1

    摘要:面试闯关在面试过程中,总会被问到一些你用到过但是记不清一些零碎的知识,现在做一下总结。在兼容模式中,页面以宽松的向后兼容的方式显示模拟老式浏览器的行为以防止站点无法工作。作为对象原型链的终点。格式采用键值对,例如参考面试总结 面试闯关1 在面试过程中,总会被问到一些你用到过、但是记不清一些零碎的知识,现在做一下总结。 第一部分:HTML+CSS 1.常用那几种浏览器测试?有哪些内核(L...

    cgspine 评论0 收藏0

发表评论

0条评论

Prasanta

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<