都是网上找到的,但是想整理一下
最初是遇见了一个问题,写了一个动态将参数数组中参数都加到某个函数里面执行的方法,具体如下:
/** * 动态执行函数 * * @param func * @param params */ function executeFunction(func,params){ if(func!=null && params!=null){ var exeStr = "func.call(this"; for(var i = 0 ; i<params.length ; i++){ exeStr += ",params["+i+"]"; } exeStr += ")"; try{ return window.eval(exeStr); }catch (e) { } } }
结果在firefox里面无法执行(找这个错误就找了半天),firefox报的错误是func没有定义,刚开始认为是eval执行的语句中的参数必须是全局的,所以把func和params都赋值为全局的,问题算是解决了。过程中到网上又看到一个帖子,提出一个疑问,直接贴代码了
<script type="text/javascript"> var foo = 1; void function(){ var foo = 2; var e = eval; e("alert(foo)"); eval("alert(foo)"); window.alert(e === eval); }(); </script>
这段代码在ie中直接弹出2,2,true,而在firefox中弹出1,2,true。理论上将如果eval只能访问全局的,那么eval那句就不可能弹出2,应该也是1。正在百思不得其解的时候,又在网上找到一个神贴,专门分析了一下firefox下eval和window.eval在语法上的不同。直接上连接
http://hi.baidu.com/kooboy/item/a676850cdec17df3a01034b6
看完之后感觉这个像是有点像bug,就是只有出现了eval(..)字样的时候才是访问局部的,其它如window.eval,或者将window.eval、eval赋给其它变量之后再使用都是全局的。