欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

firefox中eval与window.eval的区别

程序员文章站 2022-05-18 18:48:15
...

都是网上找到的,但是想整理一下

最初是遇见了一个问题,写了一个动态将参数数组中参数都加到某个函数里面执行的方法,具体如下:

/**
 * 动态执行函数
 * 
 * @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赋给其它变量之后再使用都是全局的。