IE 当eval遇上function的处理

情况1:eval里没有function,直接执行:
eval("alert('ss');");//所有浏览器正确均输出
情况2:eval里有function,function立即执行:
eval("(function(){alert('ss');})();");//所有浏览器正确输出
情况3:eval里有function,使用变量保存function引用并调用该function:
var f=eval("(function(){alert('ss');})");
f();//IE下报错:缺少对象 其他浏览器正常
当在eval定义一个function并返回给变量时,IE报错:缺少对象。可见IE下eval里定义的function并不能成功返回到eval外部。

解决方法:使function对象作为一个执行结果返回:

方法1:

var f=eval("(function(){ return function(){alert('ss');}})()");
f();//所有浏览器正确输出
eval里调用一个立即执行的函数,该函数执行之后返回一个function对象,此时该function对象的引用成功返回到外部变量。

方法2:

var f=eval("(false||function(){alert('ss');})");
f();//所有浏览器成功输出
该方法也是jquery里使用的方法,function作为或表达式的执行结果返回,同样能成功解决问题。当然,表达式并不局限于上面的false||function(){},各种表达式只要能成功返回function,均可解决问题:

/* 与表达式:*/
var f=eval("(true&&function(){alert('ss');})");
f();//所有浏览器正常输出

/* 三元表达式:*/
var f=eval("(true?function(){alert('ss');}:'');");
f();//所有浏览器正常输出

(0)

相关推荐

  • IE 当eval遇上function的处理

    情况1:eval里没有function,直接执行: eval("alert('ss');");//所有浏览器正确均输出 情况2:eval里有function,function立即执行: eval("(function(){alert('ss');})();");//所有浏览器正确输出 情况3:eval里有function,使用变量保存function引用并调用该function: var f=eval("(function(){alert('ss');})

  • 关于eval 与new Function 到底该选哪个?

    废话不多说,直接上测试代码 复制代码 代码如下: var aa = "{name:'cola',item:[{age:11},{age:22},{age:23},{age:23}]}";     var now = new Date().getTime();     for (var i = 0; i < 100000; i++) {         var a = eval("(" + aa + ")"); }     var now1

  • 当jquery ajax遇上401请求的解决方法

    jquery ajax是个很常用接口,而在请求时候,可能存在响应401的情况(身份认证过期或未登录),比较容易出现在混合应用上,如何进行身份认证,重发失败请求,还是值得注意的. ajax请求有两种方式 1. 回调 最常写的方式,成功失败处理以回调方式传入. $.ajax({ ajax参数... success : xxxxxx error: xxxxxx }); 2. Deferred方式 Deferred模式我在<js异步编程>有说明, ajax调用本身返回就是一个Deferred对象,成功

  • 当ES6遇上字符串和正则表达式

    字符串是一种重要的数据类型,而正则表达式则是赋予了编程人员更多操作字符串的能力.ES6的创作者为字符串和正则表达式添加了许多的新功能.下面玲珑将来进行一个全面的总结. 字符串和正则两个部分各两节,全文阅读时间大约10分钟 字符串 1.更好的Unicode支持 Unicode是一个字符集.将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码了. 在es6出现之前,js字符串一直基于16位字符编码进行构建.每16位序列是一个编码单元,代表一个字符,Uni

  • MySQL批量插入遇上唯一索引避免方法

    一.背景 以前使用SQL Server进行表分区的时候就碰到很多关于唯一索引的问题:Step8:SQL Server 当表分区遇上唯一约束,没想到在MySQL的分区中一样会遇到这样的问题:MySQL表分区实战. 今天我们来了解MySQL唯一索引的一些知识:包括如何创建,如何批量插入,还有一些技巧上SQL: 这些问题的根源在什么地方?有什么共同点?MySQL中也有分区对齐的概念?唯一索引是在很多系统中都会出现的要求,有什么办法可以避免?它对性能的影响有多大? 二.过程 (一) 导入差异数据,忽略重

  • 当Mybatis遇上目录树超全完美解决方案

    相信你也遇到过这种场景,判断二级目录属于哪个一级目录,一个员工属于哪个上级员工领导- 当Mybatis遇上目录树,有哪些解决方法? 一般来说,有xml直接实现和java代码递归赋值实现. 文章目录 方式一:xml直接实现方式二:java代码递归处理二级三级目录 方式一:xml直接实现 这里列出category数据表数据 表结构如下 type表示分类类型,也就是目录级别,1表示一级目录,3表示三级目录 大家就不要关注数据类型规范了,比如这里id应该bigint,type明明可以tinyint之类的

  • C语言编程const遇上指针分析

    const关键字 可以有很多用处,比如: #define ROW 10 就代表ROW的值恒为10,不可修改. 而 const int ROW=10; 也可以将值恒定,无法修改.还有 const int num[10];//将数组整个保护,无法修改. 但,并不是将被保护量变为常量,而是在处理时将其看为常量,不能对其修改. 当const与指针结合 我们先来看看这个 const int num[] = { 1,2,3,4,5 }; int* p = num; num[0] = 10; *p = 10;

  • 邪恶的eval和new Function使用介绍

    代码: 复制代码 代码如下: // 友善提醒:为了你的手指安全,请在Chrome下运行 'alert("hello")'.replace(/.+/, eval); 'alert("hello")'.replace(/.+/, function(m){new Function(m)();}); var i = 0; eval(new Array(101).join('alert(++i);')); var i = 0; new Function(new Array(1

  • javascript使用eval或者new Function进行语法检查

    使用new Function( ) 来进行语法检查 eval( ) 方法是不能乱用的,在不适当的时候使用eval( ) 方法可能导致整个程序都会出问题的: 而new Function( ) 就没这么大问题.虽然new Function( ) 在任何情况下,构造的函数都是在全局作用域下直接工作的,但只作语法检查的话,并不会因为作用域问题而产生意外结果,只要你不直接调用通过它构造的新函数. 在eval( ) 接受的参数前面增加"0," 其实这是由于IE中存在一个bug.出于某种原因,如果你

  • 当菜鸟遇上黒客之三:QQ防盗篇

    上网了吧,用Q了吧,被盗了吧,正常.想上网吧,想用Q吧,不想被盗Q吧,正常.那就来了解一些盗QQ方面的知识吧!  一.名词解释  1.字典  所谓字典,其实就是一个包含有许多密码的文本文件.字典的生成有两种方式:用字典软件生成和手动添加.一般字典软件能生成包含生日.电话号码.常用英文名等密码的字典,不过由于这样生成的字典体积大,而且不灵活,所以黑客往往会手动添加一些密码到字典里去,形成一个"智能化"的密码文件.  2.暴力破解  所谓暴力破解,其实就是用无数的密码来与登录QQ的密码进行

随机推荐