收集网文:对 window.execScript(sExpression, sLanguage) 探究

//载自: http://www.javaeye.com/post/103466

    eval() 与 window.execScript() 表面看起来好像一样,都是让提供的某一段字符串脚本运行,但有谁又知有以下区别呢?
1. 在 FireFox 下 window.execScript() 函数不能运行,而 eval() 在两个浏览器下都能正常运行;
2. window.execScript() 所执行后的脚本上文是针对整个全局域的,而 eval() 对字符串脚本执行的上下文只针对于调用 eval 函数本身的上下文;

现在问题就出来了,有哪位前辈指点一二,有没有办法将 eval() 函数对字符脚本的执行上下文扩大,不是在其函数内部,而改成全局域的上下文呢?

----------------------------------------------------------------------

swingchen 写道

代码
  1. function testEval(){   
  2.     eval(" var globalV = 'global' ");   
  3. }   
  4. testEval();   
  5. alert(globalV);   

上面这段代码,我想在最后一行的alert函数,能引用变量 globalV,当然现在上面这段代码肯定会报 globalV 变量未定义的错误,而如果将 eval() 换成 window.execScript() 则就不会错了。

如果只是为了定义变量在global context,只要把 var 去掉就好了。

-----------------------------------------------------------------------

醒来 写道
如果只是为了定义变量在global context,只要把 var 去掉就好了。


其实把var关键字去除的方式,那也根本没有摆托eval()函数执行的代码所属testEval()函数的context问题,若是以下代码可就没法去除var的方法了:

代码
  1. function testEval(){   
  2.     window.execScript(" function GlobalFun(){ return 'globalFun()';} ");   
  3. }   
  4. testEval();   
  5. alert(GlobalFun());  


我的本意还是想通过JavaScript的某种变通的实现方式,让eval()函数真正扩大其执行context域的问题。期待能有解决的办法。。。
谢谢“醒来”对问题的关注^|^

-----------------------------------------------------------------------

swingchen 写道

其实把var关键字去除的方式,那也根本没有摆托eval()函数执行的代码所属testEval()函数的context问题,若是以下代码可就没法去除var的方法了:
代码
  1. function testEval(){   
  2.     window.execScript(" function GlobalFun(){ return 'globalFun()';} ");   
  3. }   
  4. testEval();   
  5. alert(GlobalFun());  

我的本意还是想通过JavaScript的某种变通的实现方式,让eval()函数真正扩大其执行context域的问题。期待能有解决的办法。。。
谢谢“醒来”对问题的关注^|^

函数也可以是一个变量, 还是和去掉 var 一样的道理

代码
  1. function testEval(){   
  2.     window.eval("GlobalFun = function(){ return 'globalFun()';} ");   
  3. }   
  4. testEval();   
  5. alert(GlobalFun());   

----------------------------------------------------------------

hong2 写道
在任何执行eval的上下文中只需将变量直接定义成 window 下的某个“属性”即可成为全局变量。
例如
function test()
{
eval("window.a = '全局变量';");
eval("window.b = function(){alert('全局函数');}");
}
test();
alert(a);
b();

这个应该是答案的。

-------------------------------------------------------------

看一下《征服 Ajax ---Web 2.0 开发技术详解》 P/132 ,动态添加,修改,删除对象的属性和方法。

var user = new Object();

1. 添加属性

user.name = "jack";

user.age = 21;

2.添加方法

user.alert = function (){

    alert("my name is :" + this.name);  

}

执行这个方法: user.alert();

............ 

同理这个 window.a = '全局变量';也就是为window增加了一个属性 a .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值